我根据用户选择的日期从数据库中提取数字数据。出于某种原因,当我选择我的函数来提取今天的所有数据(没有)时,它仍然形成一个空值数组。
我认为问题在于select_sum()或where()函数。这是我的CI查询:
$this->db
->select_sum('column1')
->select_sum('column2')
->select_sum('column3')
->where('created_at >=', date('Y-m-d'));
$query = $this->db->get('table_name');
这里是我的foreach循环,它将所有选定的数据拉入一个数组中,以便在整个页面中使用:
$popular_items_array = array();
foreach ($query->result() as $key => $row)
{
if ($row == NULL) {
echo "Error populating table.";
} else {
$popular_items_array = $row;
}
}
为了查看数据,我做了以下操作:
echo json_encode($popular_items_array);
结果显示:
{"column1":null,"column2":null,"column3":null}
如果我选择了一个不同的时间框架(在设置日期之前数据实际存在的地方),那么相同的JSON回声将显示现有数据。我不明白的是,为什么查询会返回任何内容?为什么它不只是失败?我如何运行一个检查/循环来发现这个问题,并显示一条错误消息,让用户知道在那个日期不存在数据?
如果你想不回任何记录,你可以修改你的代码为:
$this->db
->select_sum('column1')
->select_sum('column2')
->select_sum('column3')
->where('created_at >=', date('Y-m-d'))
->having('count(*) > 0');
$query = $this->db->get('table_name');
这就是聚合函数(如sum()
、avg()
、max()
和其他函数)的工作方式,它们将从结果集中返回聚合值。如果结果集是一个空的结果集,他们将对其进行聚合。这会导致很多混乱和错误报告,但这就是应该如何工作的,可以在dba.stackeexchange.com 上找到更详细的解释
您可以使用COALESCE
将NULL
值替换为更有用的值,也可以添加count()
,这样您就可以知道生成sum()
s使用了多少行。
奇怪的是,如果你添加一个组,它会像你预期的那样工作(至少使用mysql):
SELECT sum(id) sum_id FROM `users` WHERE 0 # => array( array('sum_id' => null) )
但是:
SELECT sum(id) FROM `users` WHERE 0 GROUP BY null # => array()