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
相关产品推荐
相关产品推荐

