2013-10-16 261 views
1

感謝您的閱讀。排除mysql查詢結果的結果

我有兩個sql表。組和組__成員

組表具有組詳細信息。例如:

group_id - group_name 
    1   music 
    2   video 
    3   funny 

而且組員有訂閱用戶。例如

id - group_id - user_id 
1  1   5 
2  3   8 

用戶5是音樂的成員,用戶8是有趣的成員。我想向用戶展示他還沒有訂閱的羣組。在這種情況下,它應該的視頻和滑稽的用戶5

我想這

SELECT gr.*, gm.* FROM groups gr 
      LEFT JOIN groupmembers gm 
      ON gm.group_id = gr.group_id 
      WHERE gm.user_id != 5 

但它顯示了一切,複製某些行。我甚至不確定應該使用LEFT JOIN還是其他的。

什麼是正確的方法呢?

謝謝!

回答

2
SELECT gr.group_name 
FROM groups gr 
WHERE gr.group_id NOT IN (
    SELECT gm.group_id 
    FROM groupmembers gm 
    WHERE gm.user_id = 5 
) 

應該這樣做,基本上抓住所有的羣組ID的用戶所屬,然後做一個NOT IN將它們排除在外。你可以用JOIN做到這一點,但在我看來這更具可讀性。

+0

謝謝!有用。所以,我基本上使用NOT IN。謝謝。 –

0

您只是在查詢中缺少一個條件(OR gm.user_id IS NULL)。

SELECT gr.group_name FROM groups gr 
     LEFT JOIN groupmembers gm 
     ON gm.group_id = gr.group_id 
     WHERE gm.user_id != 5 OR gm.user_id IS NULL; 

http://www.sqlfiddle.com/#!2/0f6e59/17