Mysql SQL:简化和或查询多列
我有一个名为employe的表,其中包含以下内容Mysql SQL:简化和或查询多列,mysql,sql,Mysql,Sql,我有一个名为employe的表,其中包含以下内容 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 &
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
Where
Greatest( c, d, e, f, g ) < 3
Or
Greatest( b, d, e, f, g ) < 3
Or
Greatest( b, c, d, e, f ) < 3
Or
.....
如果我理解正确的话,您正在尝试查找一列大于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
如果列表中的所有值列必须小于3,则此列表中的最大值也必须小于3,因此可以使用最大函数,如:
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
Where
Greatest( c, d, e, f, g ) < 3
Or
Greatest( b, d, e, f, g ) < 3
Or
Greatest( b, c, d, e, f ) < 3
Or
.....
这不是MySQL语法。您是如何查询数据库的?这种问题可能是设计不佳的症状