2010-11-29 12 views
4

Iは、例えば、mysql:結合は残しましたが、結合されたテーブルから特定の項目を1つ選択してください

部材テーブル、2つだけの対応テーブルから行を選択する必要が

member_id member_name 
1   xxx 
2   yyy 

profile_picture表Iは、メンバテーブル各時間から1行を選択したい

image_id member_id image_approved 
1   1   no 
2   1   no 
3   1   yes 

profile_pictureからの1つの承認されたイメージ。私は左の結合を使用していますが、このメンバーに複数のアップロードされた画像がある場合、選択されたメンバーを複製するので正しく機能しません。面倒な部分は、私は承認された画像を選択したいと常に1つの画像が承認されることです。

SELECT * 
    FROM member 

    LEFT JOIN profile_picture 
    ON profile_picture.member_id = member.member_id 

    WHERE member.member_id = '1' 

これを出力として取得したいと思います。

member_id member_name image_id image_approved 
1   xxx   3  yes 

は可能ですか?

ありがとうございました。

編集:

提案に感謝します。あなたの多くは、を使用することを提案しています - 例えば、 AND profile_picture.image_approved = 'yes'

画像が存在する場合にのみ動作します。イメージが存在しない場合は、イメージが存在しない場合、以下のように出力する必要がありますが、出力には何もありません。

member_id member_name image_id image_approved 
1   xxx   null  null 

もう一度ありがとう!

答えて

2
select 
    * 
from 
    member m 
    left join profile_picture p on p.member_id = m.member_id 
where 
    m.member_id = '1' 
    and (p.image_approved is null or p.image_approved = 'yes') 

image_approvedは、結合条件の一部ではないので、私はjoin句でそれを入れてはいけません。むしろ行選択条件の一部なので、whereに入ります。あなたが望むものを考えれば、profile_picture、または承認された行には何も入れません。だから、条件。

+0

これはありがとうございます。 mとpが何のために立つのか尋ねることができますか?ありがとう。 – laukok

+1

'm'と' p'はテーブルaliseです。 'as'キーワードはオプションで暗黙であるので、' member'は 'm'にエイリアスされ、' profile_picture'は 'p'にエイリアスされました – Donnie

+0

今私は理解しています。本当にありがとう! :-) – laukok

0

条件にクエリーを追加すると、特定の入力に必要な出力が得られます。

SELECT * 
    FROM member 

    LEFT OUTER JOIN profile_picture 
    ON profile_picture.member_id = member.member_id 

    WHERE member.member_id = '1' 
      AND image_approved = 'yes' 
0

あなたが意味するか:

SELECT * 
    FROM member 
    LEFT JOIN profile_picture 
    ON profile_picture.member_id = member.member_id 
    WHERE member.member_id = '1' 
    AND profile_picture.image_approved = 'yes' 
0

あなたはINNER JOINが適切であるLEFT JOINを使用する必要はありません。 profile_pictureの列が必要ですか?

SELECT 
    * 
FROM 
    member 
    JOIN profile_picture USING (member_id) 
WHERE 
    member_id = 1 
    AND image_approved = 'yes' 

右側のテーブルの上に複数の列を持っている可能性があるとあなただけの1を取得したい:あなたが必要とするすべては、追加WHERE条件があるように思えますか?最後に承認された画像が必要ですか?これらを追加します。

GROUP BY 
    member_id 
ORDER BY 
    image_id 
+0

結果は0イメージを持つメンバーは含まれません。 – ksogor

+0

彼の質問から、それはそうであるようには聞こえませんが、解決するのは簡単です。 JOINをLEFT JOINに変更し、image_approved条件をON句(現在はUSING節)に入れてください。 –

0

どちらのドニーが推奨されているようにWHERE句でのNULLを受け入れるか、このようなあなたの第二のテーブルを制限するためにテーブル式を使用します。

Select member.member_id, member_name, image_id, image_approved 
From member LEFT Outer Join 
    (Select image_id, member_id, image_approved 
     From profile_picture 
     Where image_approved = 'yes') Images 
      on Images.member_id = member.member_id 
関連する問題