假设我有这样的查询:
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是员工人数,这只是让我错了。
答案 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 JOIN
。 http://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}