2011-09-22 87 views
3

我有一個服務表已提供給客戶端。我試圖做一個查詢,選擇所有收到某個用戶不提供的服務的客戶端。選擇那些從未有過某些條目

所以認爲這表...

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

如果我寫這樣的查詢:

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

我還是最終得到id_client 7.但是我不想讓客戶端7,因爲客戶端HAS從用戶1接收到該服務。(他們正在顯示,因爲他們也從用戶2接收到該服務)

在上面的示例中,我只想返回h客戶端9

如何編寫查詢以確保EVER收到來自用戶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的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,那麼您知道外部聯接找不到匹配。