You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:05:27