MySQL/PHP按天分组

3

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

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

我该如何使它显示所有的日期,即使没有记录,直到今天

Omerimuni

4个回答

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>";
        }
    }

1

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

在MySQL中生成日期序列很困难。通常你会看到一些解决方案,使用存储过程和临时表,比如这里

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

这个检查并不那么耗费时间,因为在查询结果中按日期排序,所以您只需要检查当前记录是否与循环中的当前日期相同。如果记录的日期更大,您就不应该处理这条记录。如果日期相同,处理记录并提取下一条记录。


0

除非您有一张包含日期的表格,否则无法完成此操作。然后您可以在其上执行左连接。


0

原则上,您可以创建一个包含所有日期的新表。然后在“发票”中使用左连接将此表连接到日期上。

但是,我建议您在PHP中处理此逻辑。


我可以有一些例子吗?我现在无法理解。 - Omerimuni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接