2014-07-10 16 views
1

結果過濾組我想提出這樣的一個SQL請求(這不工作):如何通過一套

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

我不知道該怎麼辦了「交集(B,(」 foo','bar'))是空的部分。我不想匹配任何'b'字段與固定集相交的行(這裏('foo','bar'))是空的。我發現迄今爲止唯一的解決方案是:

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' 

只排一次= 2應自A = 1一個返回包含 '富'

回答

2

試試這個。

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

這裏的SQLfiddle

+0

這不起作用,因爲如果有,對於= 1,兩行,一行與B =「測試」,另一個爲B =「富」,第一個會採取和a = 1將在結果集中。但是如果至少有一個與a關聯的b包含固定列表中的一個,我想排除它 – louis

+0

更新了我的答案。 – bitkot

+0

這項工作,謝謝。但是比我的問題中的子查詢要慢。我不完全明白爲什麼,雖然它會更快。 – louis