使用CodeIgniter查询构造器CASE语句获取当日记录数返回0的问题
问题排查与修正
你的代码始终返回0的核心问题是CASE语句逻辑错误,以及统计方式误用,以下是具体分析和修正方案:
问题原因
原代码中CASE WHEN DATE(created_at) = '$curr_date' THEN count(*) ELSE 0 END的逻辑完全错误:
count(*)是对整个查询结果集的总行数统计,不是针对当前行的条件计数;- 无论是否存在当日记录,这个写法要么返回全表行数,要么返回0,根本无法得到当日的实际记录数。
另外,直接将变量拼入SQL存在SQL注入风险,建议使用查询构造器的参数绑定规避。
修正方案
方案1:用WHERE过滤日期(性能最优)
直接筛选出当日数据再统计,若created_at字段有索引,还能利用索引大幅提升查询效率:
$date = new DateTime("now"); $curr_date = $date->format("Y-m-d"); // 基础写法(调用DATE函数,可能无法使用索引) $this->db->select("count(*) as records_fed_today"); $this->db->from("my_table"); $this->db->where("DATE(created_at)", $curr_date); // 更高效的写法(避免函数调用,可直接利用created_at索引) // $next_date = (new DateTime())->modify('+1 day')->format("Y-m-d"); // $this->db->where("created_at >= ", $curr_date . " 00:00:00"); // $this->db->where("created_at < ", $next_date . " 00:00:00"); $query = $this->db->get(); // 返回单个数值而非对象数组,更贴合需求 return $query->row()->records_fed_today;
方案2:用SUM+CASE统计(适合多维度统计场景)
如果需要同时统计其他日期/维度的数据,可采用SUM结合CASE的方式:
$date = new DateTime("now"); $curr_date = $date->format("Y-m-d"); // 安全写法:关闭自动转义,用参数绑定避免SQL注入 $this->db->select("SUM(CASE WHEN DATE(created_at) = ? THEN 1 ELSE 0 END) as records_fed_today", false); $this->db->bind_param('s', $curr_date); $this->db->from("my_table"); $query = $this->db->get(); return $query->row()->records_fed_today;
内容的提问来源于stack exchange,提问作者Malik Arshad Talokar
相关产品推荐
相关产品推荐

