【问题标题】:MySQL Query With Combinatorial Where Clause带有组合 Where 子句的 MySQL 查询
【发布时间】:2023-01-31 01:24:50
【问题描述】:

假设我有一个包含 A、B、C、D、E 和 F 列的表格。 我将如何查询条目 where (A, B, C, D, E, F) = (1, 2, 3, 4, 5, 6) 但只有一部分列需要匹配?例如,6 列中至少有 3 列必须匹配。

我能想到的唯一解决方案是遍历所有组合where (A, B, C) = (1, 2 ,3) or (A, B, D) = (1, 2, 4) or...

但是在这个例子中,如果我的数学是正确的,那已经是 20 个 where 子句了。有没有更好的解决方案,也适用于更多列?或者我唯一的选择是以编程方式创建一个巨大的、非人类可读的查询字符串,其中包含数百个 where 子句?

【问题讨论】:

    标签: mysql sql where-clause combinatorics


    【解决方案1】:

    您可以使用分数系统,然后按分数对行进行排序。例如:

    select *
    from (
      select t.*, 
        case when a = 1 then 1 else 0 end + 
        case when b = 2 then 1 else 0 end + 
        case when c = 3 then 1 else 0 end + 
        case when d = 4 then 1 else 0 end + 
        case when e = 5 then 1 else 0 end + 
        case when f = 6 then 1 else 0 end as score
      from t
    ) x
    where score >= 3
    order by score desc
    

    当然,此查询在执行时间方面效率不高,但对于较小的数据子集应该很有效。

    【讨论】:

      【解决方案2】:

      在 MySql 中,布尔表达式对于 true 的计算结果为 1,对于 false 的计算结果为 0,因此您可以将它们添加到 WHERE 子句中:

      WHERE (A = 1) + (B = 2) + (C = 3) + (D = 4) + (E = 5) + (F = 6) >= 3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多