MySQL/PHP GROUP BY day


MySQL/PHP GROUP BY day

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

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

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

Omerimuni

我认为最好只是得到表中的所有记录,按日期排序,并使用PHP填写空白。

在MySQL中生成日期序列是很困难的。您经常会看到使用存储过程和临时表的解决方案,如下所示。

在PHP中,创建一个遍历每个日期直到今天的循环。在循环中,您可以检查查询结果中是否存在日期。如果不是,你可以只呈现一个空行或任何你想要的。

这个检查不是很昂贵,因为您也按日期对查询中的结果进行排序,所以您只需要检查当前记录是否与循环中的当前日期相同。如果记录的日期更大,则不应处理此记录。如果日期相同,则处理该记录并获取下一条记录。

也许这不是最好的解决方案,但我自己做了: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>";
        }
    }

没有办法做到这一点,除非您有一个带有日期的表。你可以在上面左连

原则上可以创建一个包含所有日期的新表。然后,您将此表以天为单位加入到"发票"中。

但是,我建议你用PHP来处理这个逻辑