2013-10-16 224 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