2011-09-15 31 views
3

私は一日ごとにすべてのレコードをグループ化するクエリを持っています。私はそれがされるまで、何も記録がない場合でも、すべての日を私に示していることにはどうすればよいMySQL/PHP GROUP BY日

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

今日

Omerimuni

あなたは日を持つテーブルを持っていますしない限り、これを行うには方法は、ありません

答えて

0

原則として、すべての日を含む新しいテーブルを作成することができます。その後、あなたはこのテーブルを「請求書」に数日残しました。

しかし私の提案は、このロジックをPHPで処理することです。

+0

は、私はいくつかの例を持つことができます。私は今理解できない – Omerimuni

1

私は、テーブル内のすべてのレコードを取得し、日付順に並び替えて、PHPを使用してギャップを埋めることをお勧めします。

MySQLで日付のシーケンスを生成するのは難しいです。 hereのようなストアドプロシージャと一時テーブルを持つソリューションがよく見られます。

PHPでは、今日まで各日付を通過するループを作成します。ループの中で、クエリの結果に日付が存在する場合、各レコードを確認できます。そうでない場合は、空の行または必要なものをレンダリングするだけです。

このチェックはあまりにもコストがかかりません。これは、クエリで結果を日付で並べ替えるためです。したがって、現在のレコードがループ内の現在の日付と同じ日付であるかどうかを確認するだけです。 レコードの日付が大きい場合は、このレコードをまだ処理しないでください。日付が同じ場合は、レコードを処理して次のレコードをフェッチします。

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