我有两个表:“ rota”(1)和“ volunteer”(2)。名字和姓氏列在(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;
答案 0 :(得分:4)
您想要一个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;
答案 1 :(得分:0)
这是解决方案:
SELECT volunteer.id, volunteer.firstname, volunteer.lastname, COUNT(rota.shift_id), rota.volunteer_id, volunteer.firstname, volunteer.lastname
FROM volunteer
LEFT JOIN rota ON rota.volunteer_id = volunteer.id
GROUP BY volunteer.id
HAVING COUNT(rota.shift_id) = 0;