MySQL Group By Date为NULL值

时间:2011-09-14 09:37:53

标签: mysql

我试图返回商业网站每天的订单数量,但是在有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);

2 个答案:

答案 0 :(得分:2)

你可以使用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问题,了解如何动态创建日期表,然后您可以将外部联接从中查询到您的查询在约会..

Get a list of dates between two dates

答案 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程序中的空白。