MySQL:关联mb_branch统计指定日期mb_item行数,无数据显示0
解决分店item统计显示不全的问题
原SQL存在的问题
WHERE date(it.dtime)=?会过滤掉没有对应日期item数据的分店——左连接后无匹配的分店对应的it.dtime为NULL,该条件无法成立,导致仅显示有数据的分店- GROUP BY中包含
date(it.dtime)属于冗余分组,会干扰结果展示逻辑
修正后的SQL代码
SELECT br.*, br.name, COUNT(it.id) AS nit, sl.staff1 AS st1, sl.staff2 AS st2, sl.staff3 AS st3, sl.money AS money FROM mb_branch br LEFT JOIN mb_item it ON it.uid = br.uid AND DATE(it.dtime) = ? -- 把日期筛选条件移到左连接的ON子句中 LEFT JOIN mb_sell sl ON sl.uid = br.uid -- 若需关联指定日期的sell记录,可在此添加 AND DATE(sl.dtime) = ? GROUP BY br.uid, br.name, sl.staff1, sl.staff2, sl.staff3, sl.money -- 注:MySQL 5.7+开启ONLY_FULL_GROUP_BY时,GROUP BY需包含所有非聚合字段
关键调整说明
- 日期条件移至JOIN子句:左连接时只会匹配指定日期的item记录,无匹配的分店仍会被保留,
COUNT(it.id)会自动统计为0(COUNT函数会忽略NULL值) - 优化分组逻辑:仅按分店唯一标识及需要展示的非聚合字段分组,避免冗余分组导致的结果异常
- sell表关联优化:如果分店对应多条sell记录,建议用子查询或聚合函数(如MAX)获取唯一数据,防止行数倍增导致item统计数失真
内容的提问来源于stack exchange,提问作者Wilf
相关产品推荐
相关产品推荐

