mysql:left join但是从连接表中选择一个特定项

时间:2010-11-29 13:31:33

标签: sql select mysql left-join

我只需要从两个相应的表中选择一行,例如

会员表,

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

有可能吗?

感谢。

修改

感谢大家的建议。很多人建议使用 AND - 例如, AND profile_picture.image_approved ='yes'

仅在图像存在时才有效。但如果图像不存在,输出中没有任何内容,即使图像不存在也应如下输出。

member_id   member_name image_id image_approved
1           xxx         null      null

再次感谢!

5 个答案:

答案 0 :(得分: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或者批准的行中不需要任何东西。所以,条件。

答案 1 :(得分: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'

答案 2 :(得分: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'

答案 3 :(得分:0)

您无需使用LEFT JOIN INNER JOINprofile_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

是否有可能在右表上有多个列,而您只想获得一个?你想要最后批准的图像吗?添加以下内容:

{{1}}

答案 4 :(得分:0)

要么像Donnie推荐的那样容纳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