2016-12-29 11 views
0

これは私がかなり一般的なパターンだと思うものですが、私はちょうどそのための適切なクエリに苦労しています。リンクテーブルを使用した3ウェイジョイン

User Table 
id 

Member table 
id 
name 

User Member link table 
user_id 
member_id 

ユーザはユーザのテーブルに存在していても、ユーザメンバーリンクテーブルには行が存在しない可能性があります。

ユーザーテーブルのすべての行を選択したい場合、ユーザーがユーザーメンバーリンクテーブル内のメンバーへのリンクを持っていて、メンバーテーブルからリンクされている列を表示したい場合。ここで

は、私が持っているものだが、それだけでリンクされているユーザテーブルから行を取得します:

user.id user.username member.id member.name 
1   bob    null  null 
2   alice   10   Alice 
3   jane   11   Jane 
4   joe    null  null 

任意の提案:

SELECT user.id, user.username, member.id, member.name 
FROM users 
LEFT JOIN user_member ON user.id = user_member.user_id 
JOIN member ON user_member.member_id = member.id; 

は、私はこのような何かを得る必要がありますか?

+0

なぜあなたは参加1用の 'LEFT JOIN'を使用していますが、ない他のためですか? –

+0

2回目の結合でLEFT JOINを使用すると、USERからすべての行が取得されますが、一致するメンバーがある場合は重複する行が得られます。 –

+0

期待している出力のサンプルを提供できますか?また、ユーザーのメンバーが多い場合、ユーザーデータの重複を避けることはできません。 – Alex

答えて

1

user_memberテーブルのmember_idテーブルには、対応する行が常にmemberテーブルにあるとします。 最初にmemberおよびuser_memberに参加します。 第2のは、userに参加します。

SELECT user.id, user.username, member.id, member.name 
FROM users 
LEFT JOIN 
(user_member INNER JOIN member ON user_member.member_id = member.id) 
ON user.id = user_member.user_id; 
1

使用してみてくださいCROSS JOIN

SELECT user.id, user.username, member.id, member.name 
    FROM users u 
     CROSS JOIN member m 
     LEFT JOIN user_member um 
      ON u.id= um.user_id 
       AND m.id= um.member_id 
関連する問題