Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何包含缺少半个连接的记录?_Mysql_Sql - Fatal编程技术网

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}  

好极了,这就成功了。谢谢“冷却时间一过,我就接受。”威尔马丁-谢谢你,但一定要认真对待。一旦你学会了使用显式连接语法,你会发现它更容易阅读和维护。谢谢,我会为此投入一些时间。