2016-11-25 3 views
1

画像があるかどうかにかかわらず、すべてのユーザーを選択する必要があります。それはあなたのために簡単かもしれませんが、私にとっては難しいと思っています。mysqlに子があるかどうかを親に選択

私はそれを行う方法を見当もつかない2つのテーブルのユーザー、画像

Users Table 

Id | name | 
1 xyz  
2 abc 
3 qwe 
4 rty 

Images Table 

Id | user_id | image_path | is_primary 
1  1   path   0 
2  1   path   1 
3  2   path   1 
4  4   path   0 



**Result I'm expecting** 

name | image_path | is_primary 
xyz | path  | 1 
abc | path  | 1 
qwe | null  | 0   (this user has no image in images table) 
rty | path  | 0 

を持っています。 "AND"、 "Having"または "sub query"だけではできないことが分かっているので、私にとっては複雑です。

答えて

0

右側のサブクエリのLEFT JOINは、Imagesテーブルを、各ユーザの最大値がis_primaryのレコードのみに制限します。ユーザーは何の主を持っていない場合は、is_primaryの最大値はゼロであり、彼は主を持っているとき、最大値は、ここでは1

SELECT t1.name, 
     t2.image_path, 
     COALESCE(t2.is_primary, 0) AS is_primary 
FROM Users t1 
LEFT JOIN 
(
    SELECT t1.user_id, 
      t1.image_path, 
      t1.is_primary 
    FROM Images t1 
    INNER JOIN 
    (
     SELECT user_id, MAX(is_primary) AS is_primary 
     FROM Images 
     GROUP BY user_id 
    ) t2 
    ON t1.user_id = t2.user_id AND 
     t1.is_primary = t2.is_primary 
) t2 
    ON t1.Id = t2.user_id 

デモです:

SQLFiddle

+0

このクエリから繰り返しを削除できますか? @Tim – learner

+0

@learnerこれを行うロジックを用意しているわけではありません。 2番目の行を除外するルールを私たちに教えてください。 –

+0

各ユーザはプライマリイメージを1つしか持てないので、ユーザがプライマリイメージを持っている場合はそのイメージをデータベースから取得します。ホープので、いくつかのロジックを置くのに役立ちます。 @tim – learner

0

これを試してみてください:

SELECT 
    users.name, Images.image_path, IF(MAX(Images.is_primary)=1, 1, 0) 
FROM 
    users 
LEFT JOIN 
    Images 
ON 
    Images.user_id = users.Id 
GROUP BY 
    users.Id 

がMAXに集計を追加できます...

+0

繰り返しがあります。削除することは可能ですか?1つのプライマリイメージのみを選択する必要があります。すべて存在しない場合は – learner

+0

私の答えを編集しました。 – barudo

関連する問題