我有两张桌子:“rota”(1)和“志愿者”(2)。first name和last name列在(2)中,而移位在(1)中。通过下面的查询,我可以看到那些提交了轮班的人的名字,但是我想看到那些没有提交轮班的人。不知道怎么弄的。有什么帮助吗?
SELECT COUNT(rota.shift_id), rota.volunteer_id, volunteer.firstname, volunteer.lastname
FROM rota
INNER JOIN volunteer ON rota.volunteer_id=volunteer.id
GROUP BY volunteer_id;
最佳答案
您需要一个LEFT JOIN
--并将volunteer
表放在第一位,因为您需要该表中的所有行:
SELECT v.id, v.firstname, v.lastname, COUNT(r.shift_id), rota.volunteer_id
FROM volunteer v LEFT JOIN
rota r
ON r.volunteer_id = v.id
GROUP BY v.id;
注意,您不需要在
volunteer
中包含GROUP BY
中的所有列,因为v.id
唯一地标识结果集中的每一行。编辑:
如果你想要没有轮班的志愿者,那么使用
NOT EXISTS
:SELECT v.*
FROM volunteer v
WHERE NOT EXISTS (SELECT 1
FROM rota r
WHERE r.volunteer_id = v.id
);
您可以使用
LEFT JOIN
等效地执行此操作:SELECT v.id, v.firstname, v.lastname
FROM volunteer v LEFT JOIN
rota r
ON r.volunteer_id = v.id
WHERE r.volunteer_id IS NULL;