1

読んでくれてありがとう。

2 つの SQL テーブルがあります。グループと group_members

groups テーブルにはグループの詳細があります。例えば:

group_id - group_name
   1         music
   2         video
   3         funny

グループメンバーには、購読しているユーザーがいます。例えば

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 を取得し、NOT INそれらを除外するために a を実行します。あなたは a でそれを行うことができますがJOIN、私の意見では、これはより読みやすいです。

于 2013-10-16T20:42:04.823 に答える
0

OR gm.user_id IS NULLクエリに1 つの条件 ( ) がありません。

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 に答える