如何用WHERE按mid过滤并按handphone分组返回指定JSON?
目标输出结构说明
当mid = 1时,按照给定示例数据,预期返回的JSON结构为:
{ "0811111111": [ {"Id": 1, "CouponNo": 1, "Status": 1} ], "08222222222": [ {"Id": 2, "CouponNo": 2, "Status": 1}, {"Id": 3, "CouponNo": 3, "Status": 1}, {"Id": 4, "CouponNo": 4, "Status": 1} ], "08111111111": [ {"Id": 5, "CouponNo": 5, "Status": 1} ] }
实现语句
MySQL 5.7 / 8.0 版本(推荐,原生JSON支持)
直接使用内置聚合函数拼接结构,自动处理格式校验与特殊字符转义,无需手动拼接字符串:
SELECT JSON_OBJECTAGG( handphone, JSON_ARRAYAGG( JSON_OBJECT( 'Id', id, 'CouponNo', coupono, 'Status', status ) ) ) AS target_json FROM 你的业务表名 WHERE mid = 待过滤的mid值 -- 例如 mid = 1 GROUP BY handphone;
- 替换
你的业务表名为实际使用的表名称 - 调整
WHERE子句中的mid值为实际需要过滤的目标值 - JSON输出的字段顺序与
JSON_OBJECT内书写的顺序保持一致
MySQL 5.6及更早版本(无原生JSON函数兼容方案)
通过手动字符串拼接实现目标结构,需提前调整会话参数避免结果截断:
-- 调整group_concat最大长度,防止长结果被截断 SET SESSION group_concat_max_len = 102400; SELECT CONCAT( '{', GROUP_CONCAT( CONCAT( '"', handphone, '": [', GROUP_CONCAT( CONCAT( '{"Id":', id, ',"CouponNo":', coupono, ',"Status":', status, '}' ) SEPARATOR ',' ), ']' ) SEPARATOR ',' ), '}' ) AS target_json FROM 你的业务表名 WHERE mid = 待过滤的mid值 GROUP BY handphone;
- 该方案需手动处理手机号字段内的特殊字符转义,避免出现JSON格式错误
- 若字段存在NULL值,需通过
IFNULL函数补充默认值,防止拼接结果异常
内容的提问来源于stack exchange,提问作者ariefs
相关产品推荐
相关产品推荐

