在MySQL中加入逗号分隔的值

时间:2019-02-28 09:02:29

标签: mysql sql csv join jointable

我有一个这样的MySQL表

表1

1    [1803,1605]
2    [1605]
3    [1405,989]

表2

1803 List_item_1
1605 item_2
1405 item_3

以此类推

我应该得到类似

的输出
1  List_item_1,item_2
2  item_2

等等

请帮助我

3 个答案:

答案 0 :(得分:1)

卸下括号并使用FIND_IN_SET

SELECT t1.id, GROUP_CONCAT(t2.name SEPARATOR ',')
FROM t1
JOIN t2 ON FIND_IN_SET(t2.id, TRIM(TRAILING ']' FROM TRIM(LEADING '[' FROM t1.csv))) > 0
GROUP BY t1.id

Demo on db<>fiddle

答案 1 :(得分:0)

我在这里对类别ID使用简化的匹配,这取决于它们的长度大致相同

SELECT id, GROUP_CONCAT(name)
FROM tableA a
JOIN tableB b ON  a.categories LIKE CONCAT('%',b.categoryId, '%')
GROUP BY id

这是使用REGEXP_LIKE的一种变体,应该更加灵活

SELECT id, GROUP_CONCAT(name)
FROM tableA a
JOIN tableB b ON  REGEXP_LIKE(a.categories, CONCAT('[\\[,]+', b.categoryId, '[\\],]+'))
GROUP BY id

答案 2 :(得分:0)

对于MySQL 5.7和更高版本,可以在ON子句中使用JSON_CONTAINS()

select t1.id, group_concat(t2.name) as names
from table1 t1
join table2 t2 on json_contains(t1.categories, cast(t2.categoryid as json))
group by t1.id

演示:https://www.db-fiddle.com/f/odnDBDagYSdJvcK1P2TCMd/0

但是您应该考虑将数据存储在规范化架构中。由于它似乎是一个多对多关系,因此您需要第三个表

items_cats: 
------------------
item_id     cat_id
------------------
      1       1803
      1       1605
      2       1605
      3       1405

那么您的查询将是:

select ic.item_id, group_concat(t2.name) as names
from items_cats ic
join table2 t2 on t2.categoryid = ic.cat_id
group by ic.item_id

演示:https://www.db-fiddle.com/f/izHPHaV5iLsNvVnAfZs3Jo/0

此方法可以为JOIN利用索引,并且当数据大小增加时,可以显着提高性能。