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

fcy6dtqo  于 2024-01-05  发布在  Mysql
关注(0)|答案(3)|浏览(216)

我是一个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如下:

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

字符串

ktecyv1j

ktecyv1j2#

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

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

字符串

zbwhf8kr

zbwhf8kr3#

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

  1. 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。

  1. select col1, col2, col3, col4, col5
  2. from
  3. (
  4. select t.*, max(col3 and col4) over (partition by col1, col2) as flag
  5. from mytable t
  6. ) checked
  7. where flag = 0;


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

展开查看全部

相关问题