我有一个按天分组所有记录的查询。
$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']." => ".$arr['total']."<br>";
}else{
echo date('d/m/Y',$i)."=> 0<br>";
}
}
没有办法做到这一点,除非您有一个带有日期的表。你可以在上面左连
原则上可以创建一个包含所有日期的新表。然后,您将此表以天为单位加入到"发票"中。
但是,我建议你用PHP来处理这个逻辑