1

谢谢阅读。

我有两个 sql 表。组和 group_members

组表有组详细信息。例如:

group_id - group_name
   1         music
   2         video
   3         funny

并且 groupmembers 有订阅的用户。例如

id - group_id - user_id
 1       1         5
 2       3         8

用户5是music的成员,用户8是funny的成员。我想向用户显示他尚未订阅的组。在这种情况下,它应该为用户提供视频和有趣的内容 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 还是其他东西。

什么是正确的方法?

谢谢!

4

2 回答 2

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,然后执行 aNOT IN以排除它们。你可以用 a 来做,JOIN但我认为这更具可读性。

于 2013-10-16T20:42:04.823 回答
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

于 2013-10-16T21:01:32.727 回答