PHP使用group_CONCAT或其他方式连接三个表并分组
所以我有三张桌子:PHP使用group_CONCAT或其他方式连接三个表并分组,php,sql,group-concat,Php,Sql,Group Concat,所以我有三张桌子: 工人-id、姓名和其他信息 项目-id、名称和其他信息 工人项目-工人id,项目id 表Workers\u projects存储哪个worker正在哪个项目上工作(按ID) 目标是: 在某些情况下,两名工人将在同一个项目上工作。我想提出两项产出: 项目1-工人1、工人2、工人3 项目2-工人2,工人3 SQL选择第1列中的所有项目,并在第2列中列出处理该项目的每个工作人员 及 工人1-项目1、项目2 工人2-项目5,项目6 SQL选择第1列中的所有工作人员,并在第2列中列出该
选择p.name、GROUP\u CONCAT(w.name)
来自作为wp的工人联合会项目
在wp.project\u id=p.id上以p的形式左键连接项目
以wp.worker_id=w.id的形式左键加入工作人员。您发布的代码看起来非常接近您所需的输出。
这就是你想要的吗
# Projects with workers
SELECT p.name AS project, GROUP_CONCAT(w.name SEPARATOR ', ') AS workers
FROM projects p
LEFT JOIN workers_projects wp ON (p.id = wp.project_id)
LEFT JOIN workers w ON (w.id = wp.worker_id)
GROUP BY p.id
# Workers with projects
SELECT w.name AS worker, GROUP_CONCAT(p.name SEPARATOR ', ') AS projects
FROM workers w
LEFT JOIN workers_projects wp ON (w.id = wp.worker_id)
LEFT JOIN projects p ON (p.id = wp.project_id)
GROUP BY w.id
如果您只想显示包含辅助对象的项目,或者类似地,包含辅助对象的项目,可以使用内部联接
,而不是左联接
下面是一个例子:
SELECT p.name AS project, GROUP_CONCAT(w.name SEPARATOR ', ') AS workers
FROM projects p
INNER JOIN workers_projects wp ON (p.id = wp.project_id)
INNER JOIN workers w ON (w.id = wp.worker_id)
GROUP BY p.id
我得到相同的输出。表中有一行。第1列-随机项目,第2列列出所有名称。哦,对不起。更新了我的答案。它丢失了groupby
clausesthave。非常感谢你的帮助。在理解sql命令方面还有很长的路要走。还有一件事,如果你有时间,有些项目没有指派工作人员。有没有办法不在输出中显示这些项目(未分配工人)?是的,只需将联接从LEFT
更改为internal
。请参阅更新的答案<代码>左联接
s将包括在联接左侧具有值的结果。因此,没有工人的项目将包括在内。然而,内部联接
要求联接两侧都包含结果。