You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Војин Петровић

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:32:10