如何包含缺少一半联接的记录?

时间:2012-01-05 22:34:55

标签: mysql sql

假设我有这样的查询:

SELECT 
    s.staffID as staffID, 
    CONCAT_WS(", ", lname, fname) AS name, 
    GROUP_CONCAT(unit SEPARATOR ", ") AS units 
FROM 
    staff s, 
    units u, 
    staff_units r 
WHERE 
    s.staffID = r.staffID 
    AND u.unitID = r.unitID 
GROUP BY s.staffID 
ORDER BY lname

这会得到如下列表:

Alice    Accounting
Bob      Systems
Charlie  Customer Services, Administration

好的到目前为止。现在假设我删除了staff_units中记录Alice作为Accounting成员的条目。然后,运行此查询将产生一个列表,从中排除Alice,即使她仍然存在于staff表中:

Bob      Systems
Charlie  Customer Services, Administration

我可以调整此SQL,以便继续返回Alice,将其显示为未分配给某个单元吗?

我当然可以运行一个查询来获取人员列表,并为每个人员查询另一个查询以获取当前分配。但这意味着要运行n + 1个查询来构建列表,其中n是员工人数,这只是让我错了。

2 个答案:

答案 0 :(得分:6)

您将使用LEFT JOIN

适用于您的陈述,这将成为

SELECT 
    s.staffID as staffID, 
    CONCAT_WS(", ", lname, fname) AS name, 
    GROUP_CONCAT(unit SEPARATOR ", ") AS units 
FROM 
    staff s
    LEFT OUTER JOIN staff_units r ON s.staffID = r.staffID     
    LEFT OUTER JOIN units u ON u.unitID = r.unitID 
GROUP BY s.staffID 
ORDER BY lname

请注意,您正在使用的implicit type of join已被弃用。

答案 1 :(得分:1)

使用LEFT OUTER JOINhttp://dev.mysql.com/doc/refman/5.0/en/join.html

所以你的查询将是

SELECT 
    s.staffID as staffID, 
    CONCAT_WS(", ", lname, fname) AS name, 
    GROUP_CONCAT(unit SEPARATOR ", ") AS units 
FROM 
    {staff s LEFT OUTER JOIN  staff_units r ON s.staffID=r.staffID}