mysql:左连接但从连接表中选择一个特定项目
Posted
技术标签:
【中文标题】mysql:左连接但从连接表中选择一个特定项目【英文标题】:mysql: left join but select one particular item from the joined table 【发布时间】:2011-05-17 07:05:35 【问题描述】:例如,我只需要从两个对应的表中选择一行,
成员表,
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
再次感谢!
【问题讨论】:
【参考方案1】: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
中什么都不想要,要么在批准的行中不想要。所以,条件。
【讨论】:
m
和 p
是表别名。 as
关键字是可选且隐含的,因此member
别名为m
,profile_picture
别名为p
【参考方案2】:
将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'
【讨论】:
【参考方案3】:你的意思是:
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'
【讨论】:
【参考方案4】:您不需要在适合使用INNER JOIN
的地方使用LEFT 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 张图片的成员。 从他的问题来看,情况并非如此,但这很容易解决。只需将 JOIN 更改为 LEFT JOIN 并将 image_approved 条件放在 ON 子句中(目前是 USING 子句)【参考方案5】:要么按照 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
【讨论】:
以上是关于mysql:左连接但从连接表中选择一个特定项目的主要内容,如果未能解决你的问题,请参考以下文章