在 mysql 中用逗号分隔值连接三个表
Join three tables with comma separated values in mysql
我有如下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 or GROUP_CONCAT) 和 ON FIND_IN_SET() 来实现,但是由于我的 SQL 知识非常有限,所以我无法获得所需的输出。
非常感谢任何帮助。
加入表格并使用 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 |
我有如下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 or GROUP_CONCAT) 和 ON FIND_IN_SET() 来实现,但是由于我的 SQL 知识非常有限,所以我无法获得所需的输出。
非常感谢任何帮助。
加入表格并使用 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 |