2012-04-24 1 views
0

グラフを作成するために、毎日の投稿の数をカウントしたいと思います。私の問題は、SQLは何日かの結果を見つけられないので(Countは0)、私はグラフに必要な行が見つからない(投稿がない日を表示したいので)。whileループで結果を出さない日をエコーする方法は?

SELECT DATE(Date) AS Day, COUNT(*) AS COUNT 
FROM `Posts` 
GROUP By `Day` 
ORDER BY Date DESC 

while($row = mysql_fetch_array($result)) { 
    echo $row['Date'] . ": " . $row['Count']; 
    } 

水曜日に私が手に何も投稿がない場合、ループは、0結果と日が表示されませんので:monday-17-3: 5, tuesday-18-3: 2, thursday-20-3: 3が。代わりに空白を記入したいので、私はwednesday-19-3: 0のようになります。

ループに結果がない日をエコーバックするにはどうすればよいですか?

+0

たとえば、phpmyadminでクエリを実行しようとします。あなたの質問結果は水曜日ですか? –

+0

ループが正常に動作します。配列に結果のない日を追加する必要があるだけです。私は説明にいくつかの情報を追加しました。 – lisovaccaro

答えて

2

この問題を回避するには、日付表を使用してOUTER JOINを実行してから、グループ化を実行します。これは、あなたの日付の間にあなたを提供します(免責事項:あなたの日付がYYYY-MM-DDの形式であると仮定しています。そうでなければJOIN文を微調整する必要があります)。

日付テーブルについては
SELECT A.Date AS Day, COUNT(Posts.Date) AS COUNT 
FROM 
    (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date 
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a 
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b 
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c 
) A 
LEFT OUTER JOIN `Posts` ON A.Date = `Posts`.`Date` 
WHERE A.Date >= DATE_ADD(CURDATE(), INTERVAL -15 DAY) 
GROUP BY A.Date 

、私は次のポストからの方法を使用しています:generate days from date range

+0

これはほぼ完璧ですが、結果が得られない日には1つの結果が得られ、1つの結果では1つの結果が得られます。私はそれを修正する方法を見つけようとしています – lisovaccaro

+0

おっと、COUNT(*)をPosts.DateまたはPostsに変更しました。また、あなたがすべてのために1を得ている理由は、結合のため、そしてA.Date = Post.Dateの一致がないためです。どのようにあなたの日付フィールドはあなたの投稿テーブルでフォーマットされますか? –

+0

ありがとう、COUNT()をPosts.Dateに変更すると問題が解決しました。 – lisovaccaro

0

のような機能を使用して、連続した日付を通過するループを使用します。

については
$date = strtotime(date("Y-m-d", strtotime($date)) . " +1 day"); 

各サイクルで、クエリ結果を適用します。その後、すべての日付を取得します。

関連する問題