PHP 使用 GROUP_CONCAT 或其他方式连接三个表并分组
PHP Join three tables and group using GROUP_CONCAT or other way
所以我有三个表:
- 工人 - 身份证、姓名和其他信息
- 项目 - id、名称和其他信息
- Workers_projects - worker_id, project_id
Table Workers_projects 存储哪个工人在哪个项目上工作(按 id)
目标:
在某些情况下,几个工人会在同一个项目上工作。我想做两个输出:
- 项目 1 - 工人 1、工人 2、工人 3
- 项目 2 - 工人 2、工人 3。
SQL 选择第 1 列中的所有项目,并在第 2 列中列出所有从事该项目的工作人员。
和
- 工人 1 - 项目 1、项目 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
所以我有三个表:
- 工人 - 身份证、姓名和其他信息
- 项目 - id、名称和其他信息
- Workers_projects - worker_id, project_id
Table Workers_projects 存储哪个工人在哪个项目上工作(按 id)
目标:
在某些情况下,几个工人会在同一个项目上工作。我想做两个输出:
- 项目 1 - 工人 1、工人 2、工人 3
- 项目 2 - 工人 2、工人 3。
SQL 选择第 1 列中的所有项目,并在第 2 列中列出所有从事该项目的工作人员。
和
- 工人 1 - 项目 1、项目 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