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

Wil*_*tin 4 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
Run Code Online (Sandbox Code Playgroud)

这得到一个这样的列表:

Alice    Accounting
Bob      Systems
Charlie  Customer Services, Administration
Run Code Online (Sandbox Code Playgroud)

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

Bob      Systems
Charlie  Customer Services, Administration
Run Code Online (Sandbox Code Playgroud)

我可以调整这个SQL,以便它继续返回Alice,结果显示她未分配给一个单元吗?

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

Lie*_*ers 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
Run Code Online (Sandbox Code Playgroud)

请注意,您正在使用的隐式连接类型已被弃用.

  • @WillMartin - 谢谢你,但请认真对待.一旦学会使用显式连接语法,您会发现它更容易阅读和维护. (2认同)