我想发出这种类型的 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/