按今日、当月、当年统计数据:CodeIgniter分组统计失效求助
解决思路与代码实现
首先,你当前的代码只统计了所有material_status !=5数据的总和,没有按今日/当月/当年的时间维度做筛选和分组,所以自然得不到分维度的统计结果。下面给你两种可行的解决方案:
方案一:分三次查询(直观易维护)
这种方式分别对三个时间维度单独查询,代码逻辑清晰,适合快速实现:
1. 先确认表中的时间字段
首先要确保sys_material表有记录数据创建/更新时间的字段(比如create_time或update_time),下面示例假设用create_time,你需要替换成自己表中的实际字段名。
2. Controller中修改代码
// 统计今日的steam数量 $today_steamer = $this->dynamic_model->read( 'sys_material', 0, 0, 'material_status != 5 AND DATE(create_time) = CURDATE()', false, false, 'SUM(material_piece_qty_printed) AS val' )->row(); $today_val = $today_steamer->val ?? 0; // 处理null情况,默认0 // 统计当月的steam数量 $month_steamer = $this->dynamic_model->read( 'sys_material', 0, 0, 'material_status != 5 AND DATE_FORMAT(create_time, "%Y-%m") = DATE_FORMAT(NOW(), "%Y-%m")', false, false, 'SUM(material_piece_qty_printed) AS val' )->row(); $month_val = $month_steamer->val ?? 0; // 统计当年的steam数量 $year_steamer = $this->dynamic_model->read( 'sys_material', 0, 0, 'material_status != 5 AND YEAR(create_time) = YEAR(NOW())', false, false, 'SUM(material_piece_qty_printed) AS val' )->row(); $year_val = $year_steamer->val ?? 0; // 赋值到视图变量 $this->view['data']['ts_today'] = $today_val; $this->view['data']['ts_month'] = $month_val; $this->view['data']['ts_year'] = $year_val;
3. 视图中输出
steam today: <?php echo $ts_today; ?> steam this month: <?php echo $ts_month; ?> steam this year: <?php echo $ts_year; ?>
方案二:一次查询获取三个结果(性能更优)
如果想减少数据库查询次数,可以用CASE WHEN在单条SQL中同时计算三个维度的总和:
1. 自定义Model查询(推荐)
因为你的dynamic_model->read方法可能不支持复杂的聚合查询,建议在Model中新增一个方法:
// 在dynamic_model中添加方法 public function get_steamer_stats() { $sql = " SELECT SUM(CASE WHEN DATE(create_time) = CURDATE() THEN material_piece_qty_printed ELSE 0 END) AS today_val, SUM(CASE WHEN DATE_FORMAT(create_time, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m') THEN material_piece_qty_printed ELSE 0 END) AS month_val, SUM(CASE WHEN YEAR(create_time) = YEAR(NOW()) THEN material_piece_qty_printed ELSE 0 END) AS year_val FROM sys_material WHERE material_status != 5 "; return $this->db->query($sql)->row(); }
2. Controller中调用
$stats = $this->dynamic_model->get_steamer_stats(); $this->view['data']['ts_today'] = $stats->today_val ?? 0; $this->view['data']['ts_month'] = $stats->month_val ?? 0; $this->view['data']['ts_year'] = $stats->year_val ?? 0;
3. 视图输出和方案一一致
关键注意事项
- 替换
create_time为你表中实际的时间字段名; - 如果时间字段是字符串类型,需要先转换为日期格式再比较(比如
STR_TO_DATE(create_time, '%Y-%m-%d %H:%i:%s')); - 用
?? 0处理统计结果为null的情况(当某个维度没有数据时,SUM会返回null,显示0更友好)。
内容的提问来源于stack exchange,提问作者kamenrider
相关产品推荐
相关产品推荐

