感谢阅读。
我有两个sql表。 groups和group_members
组表有组详细信息。例如:
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还是别的。
对此有什么正确的解决方法?
谢谢!
答案 0 :(得分: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
来完成,但在我看来这更具可读性。
答案 1 :(得分: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;