2010-11-29 205 views
4

我只需要兩個相應的表格中選擇一行,例如,MySQL的:左連接但從連接表

成員表中選擇一個特定的項目,

member_id member_name 
1   xxx 
2   yyy 

profile_picture表

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

我想每次從成員表中選擇一行,並從profile_picture中選擇一個認可的圖像。我正在使用左連接,但它不起作用,因爲它複製選定的成員,當此成員有超過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 

這可能嗎?

謝謝。

編輯:

謝謝你們的建議。你們中許多人使用建議 - 例如,和profile_picture.image_approved =「是」

它只能當圖像出現。但如果圖像不存在,則即使在圖像不存在的情況下它應該如下輸出,輸出中也沒有任何內容。

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

image_approved條件添加到查詢中,可爲您提供給定輸入所需的輸出。

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

你並不需要使用LEFT JOIN其中一個INNER JOIN是合適的。你需要一個profile_picture的專欄,對嗎?這似乎是所有你需要的是一個額外的WHERE條件:

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

是否有可能會對右表超過一列,你只想買一個?你想要上一張獲得批准的圖像嗎?添加這些:

GROUP BY 
    member_id 
ORDER BY 
    image_id 
+0

結果將不包括成員0的圖像。 – ksogor 2010-11-29 13:43:01

+0

從他的問題來看,聽起來不像是這種情況,但這很容易解決。只需將JOIN更改爲LEFT JOIN並將image_approved條件置於ON子句(當前爲USING子句) – 2010-11-29 13:44:35

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