在MySQL中加入逗号分隔值

问题描述 投票:0回答:3

我有一个像这样的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

等等

请在这件事上给予我帮助

mysql sql csv join jointable
3个回答
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


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

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

但是:Kua zxsw指出

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

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

然后你的查询将是:

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

但是:Kua zxsw指出

此方法可以使用JOIN的索引,并在数据大小增加时显着提高性能。

© www.soinside.com 2019 - 2024. All rights reserved.