我试图返回一个商业网站每天的订单数量,但是对于有 0 个订单的日子,我的 sql 语句返回 null,因此它们是数据中的一个缺口。如何在这些天中插入一个0以使数据完整?
$sql = "SELECT COUNT(*) AS orders
FROM `orders`
GROUP BY DATE(`order_datetime`)
ORDER BY DATE(`order_time`) ASC";
$query = $this->db->query($sql);
我试过像这样使用 ifnull 但我得到的结果与上面相同:
$sql = "SELECT ifnull(COUNT(*),0) AS orders
FROM `orders`
GROUP BY DATE(`order_datetime`)
ORDER BY DATE(`order_time`) ASC";
$query = $this->db->query($sql);
最佳答案
可以使用 COALESCE 吗?
例如:
SELECT COALESCE(COUNT(*),0) AS orders
FROM `orders`
GROUP BY DATE(`order_datetime`)
ORDER BY DATE(`order_time`) ASC
它返回列表中的第一个非空值 - 如果它不为空则计数,如果为空则为 0。
http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce
稍等.. 问题是没有包含这些日期的行 所以您只获得这些日期的结果吗?
如果是这样,您也可以返回订单日期并更巧妙地显示结果:
SELECT order_datetime,COUNT(*) AS orders
FROM `orders`
GROUP BY DATE(`order_datetime`)
ORDER BY DATE(`order_time`) ASC
然后在输出结果时可能会创建一个循环,循环遍历您感兴趣的日期,如果该日期没有行则打印 0:
for (datetime d = startdate; d <= enddate; datetime.adddays(1)){
if (recordset[order_datetime] == d){
output (d,recordset[orders]);
recordset.movenext();
}else
{
output (d,0);
}
}
(注意我不知道那会是什么编程语言;-)
如果你想在数据库中完成这一切然后看看这个 SO 问题如何动态创建日期表然后你可以将它的外部连接留给你查询约会..
关于MySQL Group By Date for NULL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7414201/