【问题标题】:GROUP_CONCAT with multiple joins - what am I missing?具有多个连接的 GROUP_CONCAT - 我错过了什么?
【发布时间】: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


    【解决方案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
    

    【讨论】:

    • 太棒了!这样就解决了问题。我知道我必须以某种方式使其过于复杂。非常感谢:)
    • 欢迎@Adrian!很高兴它有帮助。
    • @Adrian:如果我的回答对您有帮助,请考虑upvoting it...谢谢!
    猜你喜欢
    • 2021-06-20
    • 2016-09-22
    • 2012-11-22
    • 1970-01-01
    • 2018-10-19
    • 2016-08-22
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    相关资源
    最近更新 更多