2

特定の範囲で毎日、またはそれが遡る限り、合計ビューを取得できるグラフを作成しています。

私が抱えている問題は0、特定の日にビューが作成されていないときのデフォルト数を埋めることです.1日にビューがまったくない日もあるため、MySQLが0何も見つからないときのデフォルトを返す必要があります-私は持っていますこれを行う方法がわかりません。

これは、1 日の合計ビューを取得するために使用するクエリです。

SELECT DATE(FROM_UNIXTIME(v.date)) AS date_views,
       COUNT(v.view_id) AS total_views
FROM 
(
    views v
)
GROUP BY date_views
ORDER BY v.date DESC

私の結果はこれを返します:

+------------+-------------+
| date_views | total_views |
+------------+-------------+
| 2012-10-17 |           2 |
| 2012-10-15 |           5 |
| 2012-10-14 |           1 |
| 2012-10-10 |           7 |
+------------+-------------+

ただし、、、が含まれていない0ため、返品したい欠落日があります。2012-10-162012-10-112012-10-122012-10-13

たとえば、次のようになります。

+------------+-------------+
| date_views | total_views |
+------------+-------------+
| 2012-10-17 |           2 |
| 2012-10-16 |           0 |
| 2012-10-15 |           5 |
| 2012-10-14 |           1 |
| 2012-10-13 |           0 |
| 2012-10-12 |           0 |
| 2012-10-11 |           0 |
| 2012-10-10 |           7 |
+------------+-------------+

返されます。

これにはどのようにアプローチしますか?

4

2 に答える 2

3

数年前にこれを行ったとき、日付をキーとしてデフォルト値 0 の空の配列を作成しました。次に、結果 att を単純にループして、それらの日付の値を変更しました。

for each($result as $row){
   $date_stats_array[$row['date']] = $row['value'];
}
于 2012-10-17T14:10:36.193 に答える
1

このような状況では、必要なすべての日付を入力する一時テーブルを作成します。その後、そのテーブルを使用して元のクエリを結合できます。

テーブルを埋めるには、次の手順を使用できます。

DROP PROCEDURE IF EXISTS filldates;
DELIMITER |
CREATE PROCEDURE filldates(dateStart DATE, dateEnd DATE)
BEGIN
  WHILE dateStart <= dateEnd DO
    INSERT INTO tablename (_date) VALUES (dateStart);
    SET dateStart = date_add(dateStart, INTERVAL 1 DAY);
  END WHILE;
END;
|
DELIMITER ;
CALL filldates('2011-01-01','2011-12-31');

https://stackoverflow.com/a/10132142/375087の礼儀

于 2012-10-17T14:05:47.387 に答える