【问题标题】:MySQL - Find all rows with at least 3 matching columnsMySQL - 查找至少有 3 个匹配列的所有行
【发布时间】:2020-03-18 21:09:07
【问题描述】:

我有一张如下表:

Id  | bool1 | bool2 | bool3 | bool4 | boo5 | bool6
100 | 1     | 0     | 1     | 1     | 1    | 0
300 | 0     | 1     | 0     | 1     | 1    | 1
600 | 0     | 0     | 1     | 0     | 1    | 1

我想获取所有与给定行至少有 3 个匹配(真)布尔值的行:

500 | 1 | 1 | 1 | 1 | 0| 1

因此,应该返回 Id 100 和 Id 300,而不是 Id 600。 我尝试了一些东西,比如 CROSS JOIN 以及所有类型的其他连接和子查询。但是,我无法弄清楚如何解决这个查询。
我在这里的问题不是 6 个布尔值,而是必须比较的 25 个。

非常感谢任何帮助。

小提琴:http://sqlfiddle.com/#!9/18480e

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    你似乎想要:

    select t.*
    from t cross join
         t t500
    where t500.id = 500 and
          ( (t.bool1 and t500.bool1) +
            (t.bool2 and t500.bool2) +
            (t.bool3 and t500.bool4) +
            (t.bool4 and t500.bool5) +
            (t.bool5 and t500.bool6)
          ) >= 3
    

    这假定匹配的行在您的表中。如果没有:

    select t.*
    from t cross join
         (select 500 as id, 1 as bool1, 1 as bool2, 1 as bool3, 1 as bool4, 0 as bool5, 1 as bool6
         ) t500
    where ( (t.bool1 and t500.bool1) +
            (t.bool2 and t500.bool2) +
            (t.bool3 and t500.bool4) +
            (t.bool4 and t500.bool5) +
            (t.bool5 and t500.bool6)
          ) >= 3
    

    【讨论】:

      【解决方案2】:

      根据您设置的条件将表连接到 given 行:

      select p.*
      from product p inner join(select * from product where id = 500) c
      on (c.bool1 = p.bool1) + (c.bool2 = p.bool2) + (c.bool3 = p.bool3) + 
         (c.bool4 = p.bool4) + (c.bool5 = p.bool5) + (c.bool6 = p.bool6) >= 3
      where p.id <> c.id  
      

      请参阅demo。
      结果:

      | ID  | bool1 | bool2 | bool3 | bool4 | bool5 | bool6 |
      | --- | ----- | ----- | ----- | ----- | ----- | ----- |
      | 100 | 1     | 0     | 1     | 1     | 1     | 0     |
      | 300 | 0     | 1     | 0     | 1     | 1     | 1     |
      

      【讨论】:

      • 谢谢,这实际上可以工作,但仍然会让我不得不输入 25 列(以后可能会更多)。如果您有一个想法,无需添加每个单独的列就可以更动态地拥有它,我会非常高兴。目前我可以解决您的解决方案,非常感谢
      • 也许一个不同的设计会更好地达到这个目的。如果列数可能会改变,为什么不创建一个带有 id、nr、booleanvalue 的表。列 nr 将是布尔值的索引。
      • 然后你可以通过聚合得到你想要的结果。该表的行数为 x25,但查询起来会更容易。
      • 考虑到我希望在其中放入大量数据,我认为这个解决方案实际上可能比连接来比较附加表更好一些。你知道什么更快(假设有 500k 条目与 1 匹配?)
      • 在这种情况下,对于 500k 行我无法判断,也不建议将它们乘以 25。您必须进行测试。
      猜你喜欢
      • 2017-03-15
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多