PHP 使用 GROUP_CONCAT 或其他方式连接三个表并分组

PHP Join three tables and group using GROUP_CONCAT or other way

所以我有三个表:

  1. 工人 - 身份证、姓名和其他信息
  2. 项目 - id、名称和其他信息
  3. Workers_projects - worker_id, project_id

Table Workers_projects 存储哪个工人在哪个项目上工作(按 id)

目标:

在某些情况下,几个工人会在同一个项目上工作。我想做两个输出:

  1. 项目 1 - 工人 1、工人 2、工人 3
  2. 项目 2 - 工人 2、工人 3。

SQL 选择第 1 列中的所有项目,并在第 2 列中列出所有从事该项目的工作人员。

  1. 工人 1 - 项目 1、项目 2;
  2. 工人 2 - 项目 5、项目 6。

SQL 选择第 1 列中的所有工人,并在第 2 列中列出该工人正在从事的每个项目。

到目前为止我得到了什么:

SELECT p.name, GROUP_CONCAT(w.name)

FROM workers_projects as wp 

LEFT JOIN projects as p ON wp.project_id=p.id

LEFT JOIN workers as w ON wp.worker_id=w.id

我做什么 - 它需要随机项目然后列出所有工人.. 我是 SQL 的新手,所以非常感谢您的帮助。

谢谢!

您发布的代码看起来非常接近您想要的输出。 这就是你想要的吗?

# 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

如果您只想显示有工作人员的项目,或者同样有工作人员的项目,您可以使用 INNER JOIN 而不是 LEFT JOIN

这是一个例子:

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