MySQL查询:按日期分组统计指定名称的记录计数
解决按Date分组统计目标子串出现记录数的问题
你遇到的核心问题是之前的查询按原始name字段值分组,导致把aaa|bbb这类组合值当成了独立分组,而我们需要的是按每个目标名称(aaa/bbb/ccc),统计每个date下包含该名称的记录数量。这里提供两种简洁的解决方案:
方案1:使用UNION ALL拆分统计
这种方法直观易懂,分别统计每个目标名称的记录数后合并结果:
SELECT date, 'aaa' AS name, COUNT(*) AS count FROM mytable WHERE name LIKE '%aaa%' GROUP BY date UNION ALL SELECT date, 'bbb' AS name, COUNT(*) AS count FROM mytable WHERE name LIKE '%bbb%' GROUP BY date UNION ALL SELECT date, 'ccc' AS name, COUNT(*) AS count FROM mytable WHERE name LIKE '%ccc%' GROUP BY date ORDER BY date, name;
原理说明:
- 每个
SELECT块单独统计一个目标名称在各date下的记录数(只要name字段包含该子串就算一条) UNION ALL将三个统计结果合并成一个格式统一的结果集- 最后按
date和name排序,完全匹配你期望的输出格式
方案2:使用CTE生成目标名称列表(更灵活)
如果后续需要统计更多目标名称,这种方法只需修改CTE中的名称列表即可,无需重复编写多个SELECT语句:
WITH names_to_count AS ( SELECT 'aaa' AS target_name UNION ALL SELECT 'bbb' UNION ALL SELECT 'ccc' ) SELECT m.date, n.target_name AS name, COUNT(*) AS count FROM mytable m JOIN names_to_count n ON m.name LIKE CONCAT('%', n.target_name, '%') GROUP BY m.date, n.target_name ORDER BY m.date, n.target_name;
原理说明:
names_to_countCTE先定义好我们要统计的所有目标名称- 通过
JOIN关联原表,筛选出name包含对应目标子串的记录 - 最后按
date和目标名称分组统计,得到最终结果
结果验证
针对你提供的原始数据,这两个方案都会得到如下结果(注:修正了date=11时bbb的计数,因为原始数据中date=11有2条记录包含bbb,符合逻辑):
date | name | count 11 | aaa | 3 11 | bbb | 2 11 | ccc | 2 12 | aaa | 3 12 | bbb | 2 12 | ccc | 2
内容的提问来源于stack exchange,提问作者Subhajit
相关产品推荐
相关产品推荐

