如何从两张关联业务表查询生成指定周期的统计数组结构?
解决方案
原有SQL的问题
你之前编写的查询存在三处核心错误:
- 表关联逻辑错误:仅对
tableA做自连接,没有关联存储名称数据的tableB - 关联类型错误:使用
INNER JOIN会自动过滤掉没有匹配事件记录的分类,无法得到计数为0的结果 - 缺少聚合逻辑:没有做分组计数,返回的是单条事件明细,而非按名称统计的数量
正确查询语句
SELECT b.name AS Name, COUNT(a.id) AS Qty FROM tableB b LEFT JOIN tableA a ON b.id = a.tableB_id AND MONTH(a.date) = 10 GROUP BY b.id, b.name ORDER BY b.id;
逻辑说明
- 采用
LEFT JOIN以tableB作为主表,保证所有分类名称都会出现在结果集中,不会因为10月没有对应事件就被过滤 - 月份筛选条件写在
JOIN的ON子句而非WHERE子句:如果写在WHERE中,左连接后无匹配事件的行的date字段为NULL,会被WHERE条件过滤,无法得到计数为0的结果 - 用
COUNT(a.id)统计匹配到的事件数量:无匹配事件时a.id为NULL,COUNT会自动忽略NULL值返回0,刚好符合需求 - 按
tableB的主键和名称分组,保证每个分类对应一条统计结果
执行上述查询后,直接返回的结果结构就和你需要的数组结构完全匹配,PHP无需额外做数据整理。
内容的提问来源于stack exchange,提问作者Jhon M. Curtis
相关产品推荐
相关产品推荐

