mysql 如何通过聚合筛选出某些行

fcy6dtqo  于 5个月前  发布在  Mysql
关注(0)|答案(3)|浏览(96)

我是一个sql新手。我有一个mysql数据库中的数据,看起来像
| 第1栏。|col 2的值。|第3栏。|第4栏。|第5栏。|
| --|--|--|--|--|
| 一|B|真正|真正|C|
| 一|D|虚假|虚假|e|
| 一|B|虚假|虚假|C|
| 一|F|虚假|虚假|G|
| 一|B|虚假|虚假|C|
| 我|B|虚假|虚假|J|
| 一|D|真正|真正|e|
我想编写一个查询,
a)查找col 3和col 4都设置为true的所有行(即上表的第一行和最后一行)
B)查找与a)中的行具有相同col 1和col 2的所有行(因此,第3行和第5行与第一行具有相同的col 1和col 2,第2行与最后一行具有相同的col 1和col 2)
c)删除a)中的行,并返回B)中的所有其他行
因此,查询返回的结果将是
| 第1栏。|col 2的值。|第3栏。|第4栏。|第5栏。|
| --|--|--|--|--|
| 一|F|虚假|虚假|G|
| 我|B|虚假|虚假|J|
对于a),我可以创建一个子表,如下所示
从_table中选择col 1、col 2、col 3、col 4、col 5作为_table,其中col 3 =“true”,col 4 =“true”
对于B),我可能需要查找a)
然后,c)将从整个表中减去b)的结果
有没有更快的方法按组?

f2uvfpb9

f2uvfpb91#

您可以简单地使用NOT EXISTS如下:

SELECT * FROM YOUR_TABLE T
WHERE NOT EXISTS 
 (SELECT 1 FROM YOUR_TABLE TT
  WHERE TT.COL1 = T.COL1 AND TT.COL2 = T.COL2
    AND TT.COL3 = 'true' AND TT.COL4 = 'true');

字符串

ktecyv1j

ktecyv1j2#

您可以使用子查询来识别col3 & col4 = true条件,然后通过使用左连接到该子查询,通过连接1&2找到所有匹配的行。最后,通过IS NULL条件过滤不匹配的行:

SELECT t.*
FROM the_table t
LEFT JOIN (
    SELECT col1, col2
    FROM the_table
    -- cols 3 & 4 = true
    WHERE col3 = 'true' AND col4 = 'true'
          --  match these rows via cols 1 & 2
    ) t34 ON t.col1 = t34.col1 AND t.col2 = t34.col2
-- now return only the unmatched rows
WHERE t34.col1 IS NULL

字符串

zbwhf8kr

zbwhf8kr3#

是的,聚合可以在这里提供帮助。您希望在col 1/col 2处查找不存在col 3 =true/col 4 =true行的组。

MAX(col3 and col4) OVER (PARTITION BY col1, col2)

字符串
对于col 3 =true/col 4 =true行的col 1/col 2组,MAX(<bool expression>)给你一个1,对于其他组,MAX(<bool expression>)给你一个0,因为在MySQL中true=1,false=0。因此,如果至少有一行符合条件,MAX(<bool expression>)给你一个1,否则为false。

select col1, col2, col3, col4, col5
from
(
  select t.*, max(col3 and col4) over (partition by col1, col2) as flag
  from mytable t
) checked
where flag = 0;


这必须在子查询中完成,因为窗口函数(这里是MAX OVER)在查询中最后执行。有一些DBMS有一个QUALIFY子句,用于执行顺序在窗口函数之后,但MySQL没有这个子句。

相关问题