繁体   English   中英

mysql:左联接,但从联接表中选择一个特定项

[英]mysql: left join but select one particular item from the joined table

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

会员表,

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 -例如, 与profile_picture.image_approved =“是”

它仅在存在图像时起作用。 但是如果没有该图像,则即使没有该图像也应在下面这样输出,但输出中没有任何内容。

member_id   member_name image_id image_approved
1           xxx         null      null

再次感谢!

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或已批准的行中什么都不想要。 所以,条件。

在查询中添加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'

你的意思是:

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'

你并不需要使用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

按照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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM