我有两张桌子:“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;

10-04 11:15