MySQL查询替换GROUP_CONCAT为JSON_OBJECT报错1582求助
首先,咱们先搞清楚这个1582错误的根源:JSON_OBJECT函数要求参数必须是成对的「键+值」组合,也就是它的语法是JSON_OBJECT(key1, value1, key2, value2, ...),参数个数必须是偶数。你之前的尝试应该是直接把GROUP_CONCAT的参数套给了JSON_OBJECT,这显然不符合它的语法规则,所以才会报错。
接下来,根据你的需求——把分组后的多个属性聚合为一个JSON对象的prop字段,咱们分两种情况给出解决方案:
方案一:使用JSON_OBJECTAGG(推荐,MySQL 5.7.22+支持)
MySQL专门提供了JSON_OBJECTAGG()函数,用来在分组查询中把多个键值对聚合为一个完整的JSON对象,完美替代你原来的GROUP_CONCAT场景。
举个实际的例子,假设你原来的GROUP_CONCAT查询是这样的:
SELECT product_id, GROUP_CONCAT(attr_name, ':', attr_value SEPARATOR ', ') AS prop FROM product_attributes GROUP BY product_id;
替换成JSON_OBJECTAGG的写法后,查询会变成:
SELECT product_id, JSON_OBJECTAGG(attr_name, attr_value) AS prop FROM product_attributes GROUP BY product_id;
这样返回的prop字段就是标准的JSON对象,比如{"color":"blue", "weight":"500g"},完全符合你的需求。
方案二:低版本MySQL兼容方案(无JSON_OBJECTAGG时)
如果你的MySQL版本低于5.7.22,不支持JSON_OBJECTAGG,可以用GROUP_CONCAT拼接成JSON格式的字符串,再转为JSON类型:
SELECT product_id, CAST( CONCAT('{', GROUP_CONCAT(CONCAT('"', attr_name, '":"', attr_value, '"') SEPARATOR ','), '}') AS JSON ) AS prop FROM product_attributes GROUP BY product_id;
⚠️ 注意:这种方式需要手动处理特殊字符(比如属性名或值里的双引号),不如JSON_OBJECTAGG安全可靠,所以优先推荐方案一。
最后再补充一句:如果只是想生成单个JSON对象(不是分组聚合),那JSON_OBJECT的用法是没问题的,比如SELECT JSON_OBJECT('name', 'iPhone', 'price', 6999) AS product;,这里参数是成对的键值,就不会报错。
内容的提问来源于stack exchange,提问作者SaidbakR

