我试图返回商业网站每天的订单数量,但是在有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);
答案 0 :(得分:2)
例如:
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问题,了解如何动态创建日期表,然后您可以将外部联接从中查询到您的查询在约会..
答案 1 :(得分:0)
您应该在子查询中手动选择所需的所有日期,然后将其与表格联系起来:
SELECT COUNT(*) AS orders FROM
( SELECT '2010-09-01' AS date UNION SELECT '2010-09-02' UNION
SELECT '2010-09-03' UNION SELECT '2010-09-04' UNION SELECT '2010-09-05' UNION
SELECT '2010-09-06' UNION SELECT '2010-09-07' ... ) AS dates
LEFT JOIN orders ON( dates.date = orders.order_datetime )
GROUP BY orders.order_datetime
ORDER BY orders.order_datetime
或者使用当前查询并在收到结果后填补php程序中的空白。