[GROUP_CONCAT有多个联接-我缺少什么?

问题描述 投票:1回答:1

我意识到这是一个非常普遍的问题,所以我花了很多时间来研究各种答案,但是没有一个可以解决我的问题。

我有一个使用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

[没有一个让我更接近。我敢肯定它相对简单,但我无法解决。谢谢!

mysql join group-concat
1个回答
1
投票

这比您想象的要复杂。您可以简单地在(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
© www.soinside.com 2019 - 2024. All rights reserved.