我有一个像这样的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
等等
请在这件事上给予我帮助
删除括号并使用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
我在类别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
对于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的索引,并在数据大小增加时显着提高性能。