为逗号分隔的每个id从其他表中选择多个数据

时间:2016-06-02 18:14:33

标签: left-join group-concat find-in-set

表一 - 工作订单

╔══════════╦══════════════╦══════════════╗
║ id       ║    wpeople   ║  start_date  ║
╠══════════╬══════════════╬══════════════╣
║ 1        ║ 1,2,4        ║  02.08.2016  ║
║ 2        ║ 4,5          ║  28.09.2016  ║
╚══════════╩══════════════╩══════════════╝

表二 - 员工

╔══════════╦═════════════════╗
║ id       ║    name         ║
╠══════════╬═════════════════╣
║ 1        ║ John            ║
║ 2        ║ Ben             ║
║ 3        ║ Ian             ║
║ 4        ║ Hank            ║
║ 5        ║ George          ║
╚══════════╩═════════════════╝

需要在项目中工作的人员的输出选择

╔══════════╦════════════════╦════════════╗
║ 1        ║ John,Ben,Hank  ║ 02.08.2016 ║
║ 2        ║ Hank,George    ║ 28.09.2016 ║
╚══════════╩════════════════╩════════════╝

我尝试过GROUP_CONCAT和FIND_IN_SET

SELECT  w.id,
        GROUP_CONCAT(e.name ORDER BY e.id) workorder
FROM    workorder w
        INNER JOIN employees e
            ON FIND_IN_SET(e.id, a.wpeople) > 0
GROUP   BY w.id

但输出是

╔══════════╦════════════════╦════════════╗
║ 1        ║ John           ║ 02.08.2016 ║
║ 1        ║ Ben            ║ 02.08.2016 ║
║ 1        ║ Hank           ║ 02.08.2016 ║
║ 2        ║ Hank           ║ 28.09.2016 ║
║ 2        ║ George         ║ 28.09.2016 ║
╚══════════╩════════════════╩════════════╝

我在谷歌搜索这个,解决方案是GROUP_CONCAT - FIND_IN_SET。可能是我对这个功能不太了解。

谢谢你的时间! 斯蒂芬

1 个答案:

答案 0 :(得分:0)

对于任何需要此人的人: 我添加了一个新表werkbon_employee

╔══════════╦═══════════════════╦═══════════════╗
║ id       ║    workorder_id   ║  employee_id  ║
╠══════════╬═══════════════════╬═══════════════╣
║ 1        ║ 1                 ║  1            ║
║ 2        ║ 1                 ║  2            ║
║ 3        ║ 1                 ║  4            ║
║ 4        ║ 2                 ║  4            ║
║ 5        ║ 2                 ║  5            ║
╚══════════╩═══════════════════╩═══════════════╝

我曾经选择

SELECT  *,
        GROUP_CONCAT(e.name ORDER BY e.id) ename
FROM werkbon
        LEFT JOIN werkbon_employee we ON werkbon.id = we.werkbon_id
        INNER JOIN employees e ON FIND_IN_SET(e.id, we.employee_id) > 0
GROUP BY werkbon.id DESC LIMIT 1

现在结果是

Werk mensen
John,Ben,Hank

Datum
02.08.2016

感谢@MarcB的帮助