我有一个这样的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
等等
请帮助我
答案 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
答案 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利用索引,并且当数据大小增加时,可以显着提高性能。