我要求从表格中选择所有值(基本上都是所有的鸟类),然后加入另一张跟踪谁喜欢那只鸟的表格。
所以我希望查询返回所有鸟类,以及人们喜欢那只鸟的记录ID。如果没有人喜欢这只鸟的记录,那么该字段应为空。
我当前的查询没有得到空值。这是:
select bird_name, member_id
from birds
right join bird_likes on birds.bird_id = bird_likes.bird_id
where member_id = 2 ;
我该怎么做才能确保列表中的每一行都显示一次?
谢谢, 亚历
答案 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