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

MySQL JSON数组多值提取:关联表匹配语言名称问题

MySQL处理JSON字符串数组关联多值匹配的解决方案

实现Desired Output 2(逗号分隔名称)

SELECT 
    t1.id,
    t1.languages,
    GROUP_CONCAT(t2.name ORDER BY t2.language_id) AS name
FROM table1 t1
JOIN JSON_TABLE(
    t1.languages,
    '$[*]' COLUMNS(lang_id VARCHAR(10) PATH '$')
) AS jt
JOIN table2 t2 ON CAST(jt.lang_id AS UNSIGNED) = t2.language_id
GROUP BY t1.id, t1.languages;

这个查询先通过JSON_TABLE把table1中存储为字符串的JSON数组拆分成单行的语言ID,再关联table2匹配对应的语言名称,最后用GROUP_CONCAT按id分组拼接成逗号分隔的字符串。加上ORDER BY可以保证名称顺序和原数组中的语言ID顺序一致。

实现Desired Output 1(JSON数组格式名称)

SELECT 
    t1.id,
    t1.languages,
    JSON_ARRAYAGG(t2.name ORDER BY t2.language_id) AS name
FROM table1 t1
JOIN JSON_TABLE(
    t1.languages,
    '$[*]' COLUMNS(lang_id VARCHAR(10) PATH '$')
) AS jt
JOIN table2 t2 ON CAST(jt.lang_id AS UNSIGNED) = t2.language_id
GROUP BY t1.id, t1.languages;

逻辑和上面一致,只是将GROUP_CONCAT替换为JSON_ARRAYAGG,直接生成JSON格式的名称数组,同样通过ORDER BY保证顺序与原数组匹配。

原查询问题说明

你之前的查询只提取了JSON数组的第一个元素($[0]),所以只能匹配数组中的第一个语言,自然会遗漏后续元素。通过JSON_TABLE将数组拆分为多行后,才能匹配到所有对应的语言名称,再通过聚合函数得到目标格式。

内容的提问来源于stack exchange,提问作者online.0227

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:03:37