mysql - 如何按组筛选结果组

标签 mysql

我想发出这种类型的 sql 请求(这行不通):

SELECT a, ... FROM tb WHERE ... GROUP BY a HAVING INTERSECTION(b, ('foo', 'bar')) is empty

我不知道如何做“INTERSECTION(b, ('foo', 'bar')) is empty' 部分。我不想匹配与固定集(此处为('foo','bar'))相交的“b”字段集为空的任何行。到目前为止我找到的唯一解决方案是:

SELECT a, ... FROM tb WHERE ... and a not in (select a from tb where b in ('foo', 'bar')) GROUP BY a

但是这个请求很慢(表有+2M行)。有没有更好的方法来做同样的事情?我想我可以使用 HAVING 来过滤结果,但我不知道该怎么做。

编辑:添加示例:

例如,如果我有:

a    b
1    'foo'
1    'test'
2    'test'
3    'bar'

只应返回行 a=2,因为其中一个 a=1 包含 'foo'

最佳答案

试试这个。

SELECT a, ..., sum(if(b in ("foo", "bar"), 1, 0)) as fooBarCount FROM tb WHERE ... GROUP BY a HAVING fooBarCount < 1;

这是 SQLfiddle

关于mysql - 如何按组筛选结果组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24679124/

相关文章:

php - 如何通过一个查询检查多个表中是否存在行?

mysql - 如何使用子查询中的值按记录排序

mysql - 在一条 MySQL 语句中运行多个查询来获取行数

php - 具有多种模型的 Eloquent ORM

mysql - 是否可以索引 mysql 表以按 A 减 B 排序?

mysql - where 子句中带有字符的整数字段返回奇怪的输出

mysql - mySQL 中的反向计数

php - 整数的 Preg_replace

php - 在查询字符串中注入(inject)变量时,Select 返回空结果

php - 如何在 laravel 中使用求和运算符选择一个案例