我有一个查询,它按天分组所有记录。
$query = mysql_query("SELECT DATE_FORMAT(date, '%d/%m/%Y') AS day, COUNT(id) AS total FROM invoices GROUP BY day");
我该如何使它显示所有的日期,即使没有记录,直到今天
Omerimuni
也许这不是最好的解决方案,但我自己做到了 :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']." => ".$arr['total']."<br>";
}else{
echo date('d/m/Y',$i)."=> 0<br>";
}
}
我认为最好的方法是获取表中按日期排序的所有记录,并使用PHP填补空缺。
在MySQL中生成日期序列很困难。通常你会看到一些解决方案,使用存储过程和临时表,比如这里。
在PHP中,创建一个循环,遍历每个日期直到今天。在循环中,您可以检查每个记录是否存在于查询结果中。如果没有,则可以渲染一个空行或其他你想要的内容。
这个检查并不那么耗费时间,因为在查询结果中按日期排序,所以您只需要检查当前记录是否与循环中的当前日期相同。如果记录的日期更大,您就不应该处理这条记录。如果日期相同,处理记录并提取下一条记录。
除非您有一张包含日期的表格,否则无法完成此操作。然后您可以在其上执行左连接。
原则上,您可以创建一个包含所有日期的新表。然后在“发票”中使用左连接将此表连接到日期上。
但是,我建议您在PHP中处理此逻辑。