세트

2014-07-10 3 views
1

에 의한 결과로 그룹을 필터링하는 데 어떻게 이런 종류의 SQL 요청 (이 작동하지)를하고 싶습니다 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가 = 1 일 이후 반환되는 행은 'foo는'

답변

2

이 시도를 포함 예를 추가 .

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

다음은이 때문에이 경우에 대해에게 = 1, 두 행, B와 B = '테스트'와 다른 하나 = '푸', 첫 번째가 될 것입니다 작동하지 않습니다 SQLfiddle

+0

입니다 찍은 및 a = 1 결과 집합에있을 것입니다. 그러나 적어도 하나의 b와 관련된 고정 목록 중 하나가 포함되어있는 경우 제외하고 싶습니다. – louis

+0

내 대답이 업데이트되었습니다. – bitkot

+0

이 작품은, 고마워. 하지만 내 질문에 subselect와 함께 요청보다 느립니다. 나는 그것이 왜 더 빠를지라도 나는 정확히 왜, 나는 이해하지 못한다. – louis