假设我有这样的查询:
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是人员数量,这只是让我错了.
你会使用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)
请注意,您正在使用的隐式连接类型已被弃用.