ID 的字符串拆分并与 MySQL 中的名称连接

String split of IDs and concat with names in MySQL

我在 MySQL

中关注 table

Table 1:
c1 ids
A1 3|5|2
A2 1|2
A3 3
A4 1|2|3|4|5
A5 2|4|1|3

Table 2:
id 名称
1 AA
2 阿伯特
3 CDE
4 XXWQ
5 是

我想加入 tb1.ids = tb2.id 上的两个 table 作为拆分 table 1 中的所有 ID,然后替换为它们的名称,然后连接再次.

输出

3|5|2 -> CDE|Y|ABERT
1|2 -> AA|ABERT

我正在使用以下代码拆分字符串。

CASE WHEN tb1.ids LIKE '%|%'THEN SUBSTRING_INDEX( `tb1.ids` , '|', 1 ) ELSE tb1.ids END AS id1,
CASE WHEN tb1.ids LIKE '%|%|%' THEN SUBSTRING_INDEX(SUBSTRING_INDEX( `tb1.ids` , '|', 2 ),'|',-1) WHEN tb1.ids LIKE '%|%' THEN SUBSTRING_INDEX( `tb1.ids` , '|', -1 )ELSE '' END AS id2,
CASE WHEN tb1.ids LIKE '%|%|%|%' THEN SUBSTRING_INDEX(SUBSTRING_INDEX( `tb1.ids` , '|', 3 ),'|',-1) WHEN tb1.ids LIKE '%|%|%' THEN SUBSTRING_INDEX( `tb1.ids` , '|', -1 ) ELSE '' END AS id3,
CASE WHEN tb1.ids LIKE '%|%|%|%|%' THEN SUBSTRING_INDEX(SUBSTRING_INDEX( `tb1.ids` , '|', 4 ),'|',-1) WHEN tb1.ids LIKE '%|%|%|%' THEN SUBSTRING_INDEX( `tb1.ids` , '|', -1 ) ELSE '' END AS id4,
CASE WHEN tb1.ids LIKE '%|%|%|%|%|%' THEN SUBSTRING_INDEX(SUBSTRING_INDEX( `tb1.ids` , '|', 5 ),'|',-1) WHEN tb1.ids LIKE '%|%|%|%|%' THEN SUBSTRING_INDEX( `tb1.ids` , '|', -1 ) ELSE '' END AS id5

如果您无法更改架构,您可以使用 LIKE 加入并将名称与 GROUP_CONCAT:

合并
select t1.c1, t1.ids, group_concat(t2.name separator '|') as names
from table1 t1
join table2 t2
  on concat('|', t1.ids, '|') like concat('%|', t2.id, '|%')
group by t1.c1, t1.ids

结果:

╔════╦═══════════╦═════════════════════╗
║ c1 ║    ids    ║        names        ║
╠════╬═══════════╬═════════════════════╣
║ A1 ║ 3|5|2     ║ CDE|ABERT|Y         ║
║ A2 ║ 1|2       ║ ABERT|AA            ║
║ A3 ║ 3         ║ CDE                 ║
║ A4 ║ 1|2|3|4|5 ║ CDE|Y|ABERT|AA|XXWQ ║
║ A5 ║ 2|4|1|3   ║ XXWQ|CDE|ABERT|AA   ║
╚════╩═══════════╩═════════════════════╝

演示:http://rextester.com/XHUP28245

如果您需要根据 t1.ids 对名称进行排序,一种可能的方法是在 GROUP_CONCAT:

中使用 ORDER BY 的 LOCATE 函数
select t1.c1, t1.ids, group_concat(
    t2.name
    order by locate(concat('|', t2.id, '|'), concat('|', t1.ids, '|'))
    separator '|'
) as names
from table1 t1
join table2 t2
  on concat('|', t1.ids, '|') like concat('%|', t2.id, '|%')
group by t1.c1, t1.ids

结果:

╔════╦═══════════╦═════════════════════╗
║ c1 ║    ids    ║        names        ║
╠════╬═══════════╬═════════════════════╣
║ A1 ║ 3|5|2     ║ CDE|Y|ABERT         ║
║ A2 ║ 1|2       ║ AA|ABERT            ║
║ A3 ║ 3         ║ CDE                 ║
║ A4 ║ 1|2|3|4|5 ║ AA|ABERT|CDE|XXWQ|Y ║
║ A5 ║ 2|4|1|3   ║ ABERT|XXWQ|AA|CDE   ║
╚════╩═══════════╩═════════════════════╝

演示:http://rextester.com/WIUQ61685

在 table 中存储分隔字段几乎总是一个坏主意。

但是,如果字段以逗号分隔,则您可以使用 FIND_IN_SET 函数。如果绝望,您可以使用 REPLACE 将 FIND_IN_SET 函数中的分隔符更改为逗号:-

SELECT a.c1,
        a.ids,
        GROUP_CONCAT(b.name SEPARATOR '|')
FROM Table1 a
INNER JOIN Table2 b
ON FIND_IN_SET(b.id, REPLACE(a.ids, '|', ','))
GROUP BY a.c1,
        a.ids