SQL Select / Join语句 - 何时没有加入?

时间:2013-02-25 09:47:20

标签: mysql sql select

所以我一直在使用这个select声明:

select runners.name, runners.age, sum(races.laptime) as totallaptime
from runners join races on runners.runnerid = races.runnerid
where runners.region = "region001"
group by runners.runnerid

列出了来自特定地区的所有选手,并总计了他们所有的单圈时间。

不幸的是,错过了该地区所有没有单圈时间的选手(可能是因为他们在races数据库中没有条目)。

如何调整此select语句以使其包含特定区域中的所有参赛者,如果0中没有任何条目,则列出totallaptime races {1}}数据库?

(对不起,对于模糊的问题标题,我无法想出总结这个问题的方法)

TIA

3 个答案:

答案 0 :(得分:5)

使用LEFT JOIN

select runners.name, runners.age, coalesce(sum(races.laptime),0) as totallaptime
from runners 
left join races on runners.runnerid = races.runnerid
where runners.region = "region001"
group by runners.runnerid

LEFT JOIN选择左表的所有行,如果存在则返回右表的结果,如果不存在,则返回值为NULL的单行。

注意:我在语句中添加了COALESCE,因为汇总NULL会产生NULL;这会将这些值更改为0。

答案 1 :(得分:3)

您必须使用LEFT OUTER JOIN,它还会为您提供“左”表(在本例中为runners)的结果,其中没有匹配的“右”表:

select runners.name, runners.age, sum(races.laptime) as totallaptime
from runners LEFT OUTER JOIN races on runners.runnerid = races.runnerid
where runners.region = "region001"
group by runners.runnerid

答案 2 :(得分:1)

编辑必须使用LEFT JOIN来包括左表中不匹配的记录

select runners.name, runners.age, sum(races.laptime) as totallaptime
from runners left join races on runners.runnerid = races.runnerid
where runners.region = "region001"
group by runners.runnerid