gpt4 book ai didi

mysql - SQL:简化多列上的 and,or 查询

转载 作者:行者123 更新时间:2023-11-29 18:40:13 25 4
gpt4 key购买 nike

我有一个名为员工的表,其中包含以下内容

id A B C D E F G
1 8 4 6 3 2 5 2
1 7 3 1 2 1 3 7
3 9 2 3 3 2 6 1
4 6 1 2 4 5 5 7
4 6 4 6 3 2 5 2

我做了这样的查询

employe.where( 
A > 7 &
(

(C<3 & D<3 & E<3 & F<3 & G<3)
|(B<3 & D<3 & E<3 & F<3 & G<3)
|(B<3 & C<3 & E<3 & F<3 & G<3)
|(B<3 & C<3 & D<3 & F<3 & G<3)
|(B<3 & C<3 & D<3 & E<3 & G<3)
|(B<3 & C<3 & D<3 & E<3 & F<3)

)
)

有什么办法可以简化上面的查询吗?因为我的表中有 20 多个列,并且我已经对所有列执行了上述查询。它看起来很丑陋,而且每一行都有相同的代码。即使我可以做这样的事情也会很好看

q1 = [C, D, E, F, G]
q2 = [B, D, E, F, G]
q3 = [B, C, E, F, G]
q4 = [B, C, D, F, G]
q5 = [B, C, D, E, G]
q6 = [B, C, D, E, F]
employe.where(
A > 7 &
(
q1<3 | q2<3 | q4<4 | q5<3 | q6<3
)
)

最佳答案

我没有 MySQL 来检查,但是否可以执行以下操作:

SELECT * FROM @employee e
INNER JOIN (SELECT id, A,
CASE WHEN a < 3 THEN 0 ELSE 1 END +
CASE WHEN b < 3 THEN 0 ELSE 1 END +
CASE WHEN c < 3 THEN 0 ELSE 1 END +
CASE WHEN d < 3 THEN 0 ELSE 1 END +
CASE WHEN e < 3 THEN 0 ELSE 1 END +
CASE WHEN f < 3 THEN 0 ELSE 1 END +
CASE WHEN g < 3 THEN 0 ELSE 1 END as cnt from @employee) c
on e.id = c.id
WHERE e.A > 7 AND c.cnt < 3

如果我理解正确的话,您正在尝试查找一列大于 7 的实例,而其他五列中至少有四列小于 3。我的示例通过简单的逻辑技巧实现了这一点(对于所有列)。如果计算 A-G 不小于 3 的所有实例,并检查对于任何列,如果该列 > 7,则该值小于 3,那么您就知道其他列最多不小于 3,因为该列本身是不少于 3 的 2 个之一。

扩展示例以获取所有列

SELECT * FROM @employee e
INNER JOIN (SELECT id,
CASE WHEN a < 3 THEN 0 ELSE 1 END +
CASE WHEN b < 3 THEN 0 ELSE 1 END +
CASE WHEN c < 3 THEN 0 ELSE 1 END +
CASE WHEN d < 3 THEN 0 ELSE 1 END +
CASE WHEN e < 3 THEN 0 ELSE 1 END +
CASE WHEN f < 3 THEN 0 ELSE 1 END +
CASE WHEN g < 3 THEN 0 ELSE 1 END as cnt from @employee) c
on e.id = c.id
WHERE (e.A > 7 OR e.B > 7 OR e.C > 7 OR e.D > 7 OR e.F > 7 or e.G > 7)
AND c.cnt < 3

关于mysql - SQL:简化多列上的 and,or 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44985286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com