我意识到这是一个非常普遍的问题,所以我花了很多时间来研究各种答案,但是没有一个可以解决我的问题。
我有一个使用PHP / MySQL的求职系统,并且GROUP_CONCAT遇到问题。
这是我的架构:
工作job_idjob_title
workerworker_idworker_name
workermapworkermap_idjob_idworker_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
[没有一个让我更接近。我敢肯定它相对简单,但我无法解决。谢谢!
这比您想象的要复杂。您可以简单地在(job_id, job_title)
和GROUP_CONCAT()
上使用聚合:
SELECT
j.job_id,
j.job_title,
GROUP_CONCAT(w.worker_name ORDER BY w.worker_name) worker_names
FROM job j
LEFT JOIN workermap wm ON job.job_id = wm.job_id
LEFT JOIN worker w ON wm.worker_id = w.worker_id
GROUP BY
j.job_id,
j.job_title