2017-02-27 42 views
0

:| 5 |
C1 IDS
A1 3 2
A2 1 | 2
A3 3
A4 1 | 2 | 3 | 4 | 5
A5 2 | 4 | 1 | 3字符串分割和的concat與名稱在MySQL

表2:
ID名稱
1 AA
2 ABERT
3 CDE
4 XXWQ
5 Y

我想從表1中加入上都tb1.ids = tb2.id表作爲拆分所有的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 
+1

絕不會在單個列中存儲多個值。如果你有這樣的問題。你能改變你的餐桌設計嗎? –

+0

我沒有寫入數據庫的權限。實際上,該專欄是特定行程的多個目的地的行程。 –

回答

1

在表中存儲分隔的字段幾乎總是一個壞主意。

但是,如果該字段用逗號分隔,則可以使用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 
+0

這比我的解決方案還要好。 –

+0

謝謝你,謝謝你用逗號固定錯別字。 – Kickstart

+0

非常感謝,你們倆:) –

1

如果你不能改變你可以加入使用類似的模式,並結合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訂購名稱,則可能會有一個w AY是GROUP_CONCAT用於ORDER LOCATE函數BY:

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

+0

爲什麼你使用group by,如果兩個值相同,那麼只會創建一條記錄,如 A1 - > 3 | 2 | 5 A2 - > 3 | 2 | 5 –

+0

我已將查詢更改爲有些事情更有意義。你沒有在你的問題中發佈確切的輸出格式。 –

+0

爲什麼兩個相同的tb2。IDS是給混亂的名稱作爲 A1 - > 3 | 5 | 2 - > CDE | Y | ABERT A2 - > 3 | 5 | 2 - > Y | CDE | ABERT –