在mysql中用逗号分隔值连接三个表

Posted

技术标签:

【中文标题】在mysql中用逗号分隔值连接三个表【英文标题】:Join three tables with comma separated values in mysql 【发布时间】:2020-10-02 23:58:39 【问题描述】:

我有如下 3 个表

**tbl_link**
╔═════════════╦═══════════════╦═══════════════╗
║ subject_id  ║ system_csv_id ║class_csv_id   ║
╠═════════════╬═══════════════╬═══════════════╣
║ 1           ║ 4,3           ║ 5,1,3,4       ║
║ 2           ║ 1,3           ║ 2,3           ║
╚═════════════╩═══════════════╩═══════════════╝

**tbl_system**                           **tbl_class**
╔═══════════╦════════════════════╗       ╔═══════════╦════════════════════╗
║ system_id ║ system_desc        ║       ║ class_id  ║ class_desc         ║                
╠═══════════╬════════════════════╣       ╠═══════════╬════════════════════╣
║ 1         ║ ANY                ║       ║ 1         ║ GRADE 8            ║
║ 2         ║ LOCAL SYSTEM       ║       ║ 2         ║ GRADE 9            ║
║ 3         ║ BRITISH SYSTEM     ║       ║ 3         ║ GRADE 10           ║ 
║ 4         ║ AMERICAN SYSTEM    ║       ║ 4         ║ GRADE 11           ║
╚═══════════╩════════════════════╝       ║ 5         ║ GRADE 12           ║
                                         ╚═══════════╩════════════════════╝

我想查询 tbl_link 并关联 'system_csv_id' -> 'system_desc' 和 'class_csv_id, -> 'class_desc' 以达到以下输出。

╔═════════════╦═══════════════════╦═════════════════════════════════════════╗
║ subject_id  ║ system            ║ class                                   ║
╠═════════════╬═══════════════════╬═════════════════════════════════════════╣
║ 1           ║ AMERICAN,BRITISH  ║ GRADE 12, GRADE 8, GRADE 10, GRADE 11   ║
║ 2           ║ ANY, BRITISH      ║ GRADE 9, GRADE 10                       ║
╚═════════════╩═══════════════════╩═════════════════════════════════════════╝

我进行了一些搜索以找到解决方案。我得到的只是这可以使用(CONCAT 或 GROUP_CONCAT)和 ON FIND_IN_SET() 来实现,但由于我的 SQL 知识非常有限,我无法实现所需的输出。

任何帮助将不胜感激。

【问题讨论】:

这是 2 个常见问题解答——摆脱 CSV 并引入 CSV。请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:***.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。请在代码问题中给出minimal reproducible example--包括剪切、粘贴和可运行示例。 【参考方案1】:

加入表格并使用group_concat()

select l.subject_id,
  group_concat(distinct s.system_desc order by find_in_set(s.system_id, l.system_csv_id)) system,
  group_concat(distinct c.class_desc order by find_in_set(c.class_id, l.class_csv_id)) class
from tbl_link l
inner join tbl_system s on find_in_set(s.system_id, l.system_csv_id) 
inner join tbl_class c on find_in_set(c.class_id, l.class_csv_id) 
group by l.subject_id

请参阅demo。 结果:

| subject_id | system                         | class                              |
| ---------- | ------------------------------ | ---------------------------------- |
| 1          | AMERICAN SYSTEM,BRITISH SYSTEM | GRADE 12,GRADE 8,GRADE 10,GRADE 11 |
| 2          | ANY,BRITISH SYSTEM             | GRADE 9,GRADE 10                   |

【讨论】:

以上是关于在mysql中用逗号分隔值连接三个表的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 使用逗号分隔列表 - 连接表

SQL Server 将三个不同的列连接成逗号分隔且没有重复值

在变量 BASH 的一行中用逗号分隔值

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

MySQL 查询:连接表并将记录显示为单行中的逗号分隔字符串

逗号分隔的连接和MySQL中的语法连接有啥区别? [复制]