Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL:简化和或查询多列_Mysql_Sql - Fatal编程技术网

Mysql SQL:简化和或查询多列

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 &

我有一个名为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 & 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语法。您是如何查询数据库的?这种问题可能是设计不佳的症状