从其他表中为每个用逗号分隔的 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 选择多个数据的主要内容,如果未能解决你的问题,请参考以下文章