MySQL中如何将JSON整数数组用于IN子句关联查询行业名称
解决方案
方法一:使用JSON_TABLE(MySQL 8.0+ / MariaDB 10.2+)
这是最简洁高效的实现方式,先将文本类型的industries字段转为JSON格式,再通过JSON_TABLE把数组拆分为单独的行,最后关联行业表获取名称。
假设文章表为articles,包含id、title、industries(文本类型存储JSON数组)字段;行业表industries包含id、name字段,查询语句如下:
SELECT a.id, a.title, GROUP_CONCAT(i.name SEPARATOR ', ') AS industry_names FROM articles a JOIN JSON_TABLE( CAST(a.industries AS JSON), '$[*]' COLUMNS(industry_id INT PATH '$') ) jt ON TRUE JOIN industries i ON jt.industry_id = i.id GROUP BY a.id, a.title;
CAST(a.industries AS JSON):将文本格式的数组转换为MySQL可识别的JSON对象。JSON_TABLE:把JSON数组拆分为一行行独立的industry_id值。GROUP_CONCAT:将同一篇文章的多个行业名称拼接为字符串;若需单独展示每个行业对应关系,去掉GROUP_CONCAT和GROUP BY即可。
方法二:低版本MySQL兼容方案(无JSON_TABLE)
如果你的MySQL版本低于8.0,无法使用JSON_TABLE,可以通过字符串拆分的方式实现:
SELECT a.id, a.title, GROUP_CONCAT(i.name SEPARATOR ', ') AS industry_names FROM articles a JOIN (SELECT 1 AS num UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) nums -- 数字数量需大于数组最大元素个数 JOIN industries i ON i.id = CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(a.industries, '[', ''), ']', ''), ',', nums.num), ',', -1) AS UNSIGNED) WHERE nums.num <= JSON_LENGTH(CAST(a.industries AS JSON)) GROUP BY a.id, a.title;
- 先移除
industries字段的[]符号,将其转为逗号分隔的字符串。 - 借助
SUBSTRING_INDEX和数字表,逐个提取每个行业ID。 JSON_LENGTH用于判断当前数字是否在数组元素个数范围内,避免无效匹配。
补充提示
- 如果
industries字段的数组存在多余空格,需要在提取ID时用TRIM函数去除,例如TRIM(SUBSTRING_INDEX(...))。 - 若不需要拼接名称,仅需展示文章与行业的一一对应关系,直接删除
GROUP_CONCAT和GROUP BY子句即可。
内容的提问来源于stack exchange,提问作者Војин Петровић
相关产品推荐
相关产品推荐

