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 ║
╚════╩═══════════╩═════════════════════╝
在 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
我在 MySQL
中关注 tableTable 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:
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 ║
╚════╩═══════════╩═════════════════════╝
在 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