选择一个表中的所有项并与另一个表连接,允许空值

时间:2011-03-10 20:11:46

标签: mysql sql

我要求从表格中选择所有值(基本上都是所有的鸟类),然后加入另一张跟踪谁喜欢那只鸟的表格。

所以我希望查询返回所有鸟类,以及人们喜欢那只鸟的记录ID。如果没有人喜欢这只鸟的记录,那么该字段应为空。

我当前的查询没有得到空值。这是:

select  bird_name, member_id 
from birds  
right join bird_likes on birds.bird_id = bird_likes.bird_id 
where member_id = 2 ;

我该怎么做才能确保列表中的每一行都显示一次?

谢谢, 亚历

4 个答案:

答案 0 :(得分:27)

您必须使用left join代替right join

不同的联接

inner join:只保留两个表中数据的行

left join:保留左表的所有行并添加正确的行

right join:保留右表的所有行并添加左侧的行

左表总是我们已经拥有的表,右表是我们加入的表。

对于记录,还有一个cross join,它将左表中的每一行与右表中的每一行连接起来,但这个行不经常使用。

我希望现在所有这一切都更加清晰:)

更正了查询

select  bird_name, member_id 
from birds  
left join bird_likes on birds.bird_id = bird_likes.bird_id 
where member_id = 2;

请注意,这假设列member_id位于鸟表中,否则您可以保持这样的条件:

select  bird_name, member_id 
from birds  
left join bird_likes on 
    birds.bird_id = bird_likes.bird_id and
    bird_likes.member_id = 2;

答案 1 :(得分:3)

SELECT bird_name, member_id
FROM birds
LEFT JOIN bird_likes ON birds.bird_id=bird_likes.bird_id AND member_id=2

答案 2 :(得分:2)

您希望在这种情况下使用left outer join

select  bird_name, member_id 
from birds  
left outer join bird_likes on birds.bird_id = bird_likes.bird_id 
where member_id = 2;

这将返回所有鸟类名称,并为具有空白的鸟类返回“null”。

答案 3 :(得分:1)

将您的RIGHT JOIN更改为LEFT JOIN,这将带来所有birds条记录,无论它们是否与bird_likes

有关系