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

Posted

技术标签:

【中文标题】从其他表中为每个用逗号分隔的 id 选择多个数据【英文标题】:Select multiple data from other table for each id separated by comma 【发布时间】:2016-10-02 15:08:19 【问题描述】:

表一 - 工单

╔══════════╦══════════════╦══════════════╗
║ 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 ║
╚══════════╩════════════════╩════════════╝

我在 google 上搜索这个,解决方案是 GROUP_CONCAT - FIND_IN_SET。可能是我对这个功能不是很了解。

感谢您的宝贵时间! 斯蒂芬

【问题讨论】:

无论如何你都没有a 别名,因此查询将是一个明确的语法错误a.wpeople 将不存在。你为什么不从一开始就规范化你的表格呢?在第二个字段中存储多个数据值几乎是糟糕设计的标志。 find_in_set() 效率非常低,因为不能使用索引。 如上所述,您需要对该数据进行非规范化。也就是说,像这样格式化输出最好留给表示层而不是数据层。你用什么来显示数据?一个网页?一个应用程序? @ Marc 我的错,我忘记了...要更改它,在我的代码中它是 a 和 b,在这里我从员工和 b 表单工作订单中进行了更改 @mrunion 我正在使用这个 SQL询问申请,用于管理员工的工作,最后发送电子邮件让他们知道...... 无关紧要。这并不妨碍您对设计进行规范化。 因此,如果您要发送电子邮件,一些代码会获取数据结果并将它们放入电子邮件正文并发送电子邮件,对吗?使该代码以行形式获取结果(一旦您按照 Marc B 所说正确地对数据进行非规范化,它们将如何)并循环通过它们以获得您想要的形式的输出。 【参考方案1】:

对于任何需要这个的人: 我添加了一个新表 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 的帮助

【讨论】:

以上是关于从其他表中为每个用逗号分隔的 id 选择多个数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL CE 中的表中构建逗号分隔列表?

MySQL - 如何选择表中的行,其中 id 值位于另一个表中的逗号分隔字段中?

php 如何从mysql输出数组用逗号分隔?

从表中选择数值,其中数值以逗号分隔的字符串。

用逗号将每个值与laravel中的多个选择分开

php如何将逗号分隔的多个json格式的字符串作为一个值插入到mysql表中? [复制]