2010-11-29 128 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