数据库查询需求:按规则统计readStatus并返回指定字段
解决方案
针对你的需求,我调整了SQL语句,解决了原查询只返回readStatus=false记录、未处理空requestType分组、以及同一CategoryGroup被拆分的问题,具体实现如下:
SELECT COALESCE(m.requestType, '') AS requestType, CASE WHEN COALESCE(m.requestType, '') = '' THEN 'BLANK' ELSE s.categoryGroup END AS categoryGroup, SUM(CASE WHEN m.readStatus = 0 THEN 1 ELSE 0 END) AS count FROM mb_message m JOIN mb_subcategory s ON m.subCategoryId = s.subCategoryId WHERE m.storeId = ? AND m.countryCode = ? AND m.modifiedDate >= ? GROUP BY COALESCE(m.requestType, ''), CASE WHEN COALESCE(m.requestType, '') = '' THEN 'BLANK' ELSE s.categoryGroup END ORDER BY categoryGroup, requestType;
关键逻辑说明
- 统一处理空requestType:用
COALESCE(m.requestType, '')将NULL转为空字符串,把NULL和空值的requestType归为同一类,并将它们的categoryGroup强制设为'BLANK',满足你对空requestType分组的要求。 - 完整统计(含全true的情况):用
SUM(CASE WHEN m.readStatus = 0 THEN 1 ELSE 0 END)替代原查询的COUNT(),这样即使某个requestType+categoryGroup组合下没有未读(readStatus=0)的记录,也会返回0,而不是被过滤掉。 - 正确分组CategoryGroup:按处理后的categoryGroup分组,而不是原查询的subCategoryId,这样subcategoryId 12和13这类属于同一CategoryGroup的记录会被合并到同一组,符合你的业务规则。
- 保留原有过滤条件:保留了你原查询中的storeId、countryCode、modifiedDate过滤规则,确保统计范围符合要求。
如果需要展示所有存在的requestType(即使没有符合过滤条件的记录),可以先从mb_message表中提取所有去重的requestType,再左连接统计结果(前提是不需要关联subcategory的信息,或者subcategory有全量数据),示例如下:
WITH all_request_types AS ( SELECT DISTINCT COALESCE(requestType, '') AS requestType FROM mb_message ) SELECT art.requestType, CASE WHEN art.requestType = '' THEN 'BLANK' ELSE s.categoryGroup END AS categoryGroup, COALESCE(SUM(CASE WHEN m.readStatus = 0 THEN 1 ELSE 0 END), 0) AS count FROM all_request_types art LEFT JOIN mb_message m ON COALESCE(m.requestType, '') = art.requestType LEFT JOIN mb_subcategory s ON m.subCategoryId = s.subCategoryId WHERE m.storeId = ? AND m.countryCode = ? AND m.modifiedDate >= ? GROUP BY art.requestType, CASE WHEN art.requestType = '' THEN 'BLANK' ELSE s.categoryGroup END ORDER BY categoryGroup, art.requestType;
不过这个版本适用于需要展示所有历史存在的requestType的场景,你可以根据实际需求选择。
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

