【发布时间】:2020-02-05 19:56:36
【问题描述】:
我意识到这是一个很常见的问题,所以我花了很多时间查看各种答案,但没有一个有助于解决我的问题。
我在 PHP / MySQL 中有一个工作请求系统,但我遇到了 GROUP_CONCAT 的问题。
这是我的架构:
工作
工作编号
职位名称
工人
worker_id
工人姓名
工人地图
workermap_id
工作编号
worker_id
包含工作的表、可能工作人员的工作人员表和将工作人员映射到工作的工作人员表。一个工作可以有一个或多个工人,一个工人可以有一个或多个工作。
当记录一个工作时,它会在 job 中创建一个条目,但在 workermap 中没有任何内容,直到有人专门分配了一个工作人员。这意味着当我查询作业时,我会使用左连接来执行此操作,因为 workermap 中没有每个作业的条目:
SELECT
job.job_id,
job.job_title,
workermap.worker_id,
worker.worker_name
FROM job
LEFT JOIN workermap
ON job.job_id = workermap.job_id
LEFT JOIN worker
ON workermap.worker_id = worker.worker_id
问题是如果有多个工人分配给一个工作,这会返回多行:
+--------+-----------------------------+-------------+
| job_id | job_title | worker_name |
+--------+-----------------------------+-------------+
| 1 | New homepage | Alan |
| 1 | New homepage | John |
| 2 | Redesign footer | John |
| 2 | Redesign footer | Sarah |
| 3 | Update contact page content | NULL |
+--------+-----------------------------+-------------+
我想要的是这个:
+--------+-----------------------------+-------------+
| job_id | job_title | worker_name |
+--------+-----------------------------+-------------+
| 1 | New homepage | Alan, John |
| 2 | Redesign footer | John, Sarah |
| 3 | Update contact page content | NULL |
+--------+-----------------------------+-------------+
我知道我需要使用 CONCAT 将工人姓名连接在一起,但如果我这样做:
SELECT
job.job_id,
job.job_title,
GROUP_CONCAT(worker.worker_name)
FROM job
LEFT JOIN workermap
ON job.job_id = workermap.job_id
LEFT JOIN worker
ON workermap.worker_id = worker.worker_id
然后我只得到所有工人串联的一行:
+--------+--------------+----------------------+
| job_id | job_title | worker_name |
+--------+--------------+----------------------+
| 1 | New homepage | Alan,John,John,Sarah |
+--------+--------------+----------------------+
我尝试了以下方法:
SELECT
job.job_id,
job.job_title,
workermap.worker_id,
workermap.worker_list
FROM job
LEFT JOIN
(
SELECT workermap.worker_id, GROUP_CONCAT(worker_name) AS worker_list
FROM workermap
INNER JOIN worker
ON workermap.worker_id = worker.worker_id
)
AS workermap
SELECT
job.job_id,
job.job_title,
(SELECT GROUP_CONCAT(worker.worker_name)
FROM worker
WHERE worker.worker_id = workermap.worker_id)
AS combinedworkers
FROM job
LEFT JOIN workermap
ON job.job_id = workermap.job_id
SELECT
job.job_id,
job.job_title,
workermap.worker_id,
worker.worker_list
FROM job
LEFT JOIN workermap
ON job.job_id = workermap.job_id
LEFT JOIN
(
SELECT worker_id, GROUP_CONCAT(worker_name) AS worker_list
FROM worker
GROUP BY worker_id
)
AS worker
ON workermap.worker_id = worker.worker_id
这些都没有让我更接近。我敢肯定它相对简单,但我无法解决。谢谢!
【问题讨论】:
标签: mysql join group-concat