2011-09-22 9 views
3

고객에게 제공되는 서비스 표가 있습니다. 특정 사용자가 제공하지 않은 서비스를받은 모든 클라이언트를 선택하는 쿼리를 작성하려고합니다.특정 항목이없는 항목을 선택하십시오.

SELECT id_client FROM table WHERE id_service=4 AND id_user<>1 

나는 여전히 id_client 7을 그만 둘하지만 고객을받지 않으 :이 같은 쿼리를 작성하는 경우

그래서

id_client | id_service | id_user 
-------------------------------- 
    5  |  3  | 2 
    7  |  4  | 2 
    7  |  4  | 1 
    9  |  4  | 2 
    8  |  4  | 1 

...이 테이블을 고려 7 클라이언트는 사용자 1로부터 해당 서비스를 받았다. (그들은 사용자 2로부터 서비스를 받았기 때문에 나타나고있다.)

위의 예제에서 나는 위트를 돌려주고 싶다. h 클라이언트 9

어떻게 사용자 1의 서비스 4를받은 클라이언트가 표시되지 않도록 쿼리를 작성할 수 있습니까?

+1

'id_client'는 결코 테이블에 '1'의 값을 가지지 않으므로'id_client'가'1' 인 레코드를 어떻게 얻을 수 있습니까? –

+0

죄송합니다. id_client를 넣는 것을 의미합니다. 7. 방금 업데이트했습니다 ... – rgbflawed

답변

1
SELECT id_client 
FROM table 
WHERE id_service = 4 
GROUP BY id_client 
HAVING MAX(CASE 
      WHEN id_user = 1 THEN 2 
           ELSE 1 
      END) = 1 
+0

안녕 마틴, 당신의 솔루션과 Saket 모두 트릭을합니다. 하지만 네가 정말로 흥미 롭다. 나는 당신이 SQL과 같은 CASE를 사용할 수 있다는 것을 몰랐습니다. 그래도 Saket과는 반대로 이런 방식으로 어떤 이점이 있는지 물어볼 수 있습니까? – rgbflawed

+0

@ Steven- 귀하의 데이터와 색인에 따라 달라질 수 있습니다. 둘 다 시도해보십시오. –

+0

+1 서브 쿼리가있는'IN'보다 집계가 우선됩니다. – Matthew

3

이 시도 :

SELECT DISTINCT id_client 
FROM yourtable t 
WHERE id_service = 4 AND id_client NOT IN 
(SELECT DISTINCT id_client 
FROM yourtable t 
WHERE id_user = 1 
) 
2

내가 이런 식으로 쓰기 것 :

왼쪽 외부의 조건이 충족되지 조인
SELECT DISTINCT id_client 
FROM mytable t1 
LEFT OUTER JOIN mytable t2 
    ON t1.id_client = t2.id_client AND t2.id_user = 1 
WHERE t2.id_client IS NULL 

, 왼쪽에있는 행 여전히 반환되고 오른쪽 행의 모든 ​​열은 null입니다. 따라서 일치하는 항목이있는 경우 null이 아닌 특정 열의 null의 경우를 검색하면 외부 조인이 일치하는 항목을 찾을 수 없습니다.

관련 문제