Mysql 如何包含缺少半个连接的记录?
假设我有这样一个查询:Mysql 如何包含缺少半个连接的记录?,mysql,sql,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.uni
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
这将得到一个类似以下内容的列表:
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\u units
中记录Alice为会计成员的条目。运行此查询将生成一个列表,其中Alice被排除在外,即使她仍然存在于staff
表中:
Bob Systems
Charlie Customer Services, Administration
我是否可以调整此SQL,使其继续返回Alice,并将其显示为未分配给某个单元
当然,我可以运行一个查询来获取员工列表,然后对每个员工运行另一个查询来获取当前的任务。但这意味着要运行n+1查询来构建列表,其中n是员工的数量,这让我大错特错。您将使用
适用于你的陈述,这将成为
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
请注意,您正在使用的已被弃用 使用
左外连接
因此,您的查询将是
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}
好极了,这就成功了。谢谢“冷却时间一过,我就接受。”威尔马丁-谢谢你,但一定要认真对待。一旦你学会了使用显式连接语法,你会发现它更容易阅读和维护。谢谢,我会为此投入一些时间。