MySQL / PHP GROUP BY日

时间:2011-09-15 14:36:17

标签: php mysql

我有查询按天分组所有记录。

$query = mysql_query("SELECT DATE_FORMAT(date, '%d/%m/%Y') AS day, COUNT(id) AS total FROM invoices GROUP BY day");

我是怎么做到的,它向我展示了所有的日子,即使没有记录,直到今天

Omerimuni

4 个答案:

答案 0 :(得分:1)

我认为最好只获取表中的所有记录,按日期排序并使用PHP填补空白。

很难在MySQL中生成一系列日期。您经常会看到包含存储过程和临时表的解决方案,例如here

在PHP中,创建一个循环,遍历每个日期,直到今天。在循环中,如果查询结果中存在日期,则可以检查每条记录。如果没有,您可以只渲染一个空行或任何你想要的。

此检查不是那么昂贵,因为您也会按日期对查询中的结果进行排序,因此您只需要检查当前记录是否与循环中的当前日期具有相同的日期。 如果记录的日期更长,则不应处理此记录。如果日期相同,则处理记录并获取下一条记录。

答案 1 :(得分:1)

也许这不是最佳解决方案,但我自己做了:D

$result = mysql_query("SELECT date_format(date, '%Y-%m-%d') AS date FROM invoices ORDER BY id ASC LIMIT 1");
    $first = mysql_fetch_array($result);

    $year = date('Y', strtotime($first['date']));
    $month = date('m', strtotime($first['date']));
    $day =  date('d', strtotime($first['date']));


    for ($i = strtotime($year.'-'.$month.'-'.$day); $i < strtotime('NOW'); $i=$i+24*60*60){
        $r = date('d/m/Y',$i);
        $res = mysql_query("SELECT DATE_FORMAT(date, '%d/%m/%Y') AS day, COUNT(id) AS total FROM invoices WHERE DATE_FORMAT(date, '%d/%m/%Y') LIKE '%$r%' GROUP BY day");
        $arr = mysql_fetch_array($res);

        if(mysql_num_rows($res)){
            echo "".$arr['day']."&nbsp;=>&nbsp;".$arr['total']."<br>";
        }else{
            echo date('d/m/Y',$i)."=>&nbsp; 0<br>";
        }
    }

答案 2 :(得分:0)

没有办法做到这一点,除非你有几天的表。你可以加入吧

答案 3 :(得分:0)

原则上,您可以创建一个包含所有日期的新表。然后你就把这张桌子加入了“发票”中。

但是,我的建议是在PHP中处理这个逻辑。