2012-01-04 5 views
1

は、私は(私は、私は一時間当たり一週間かけて得たどのように多くの訪問見ることができ、同じ文の中で一日の曜日の&も時間に応じてデータを抽出しようとしている。ここでのステ​​ートメントです。MySQLは範囲内の欠損時間/日付をどのように埋めるのですか?

SELECT 
count(id) as count, 
HOUR(created) as hour_of_day, 
WEEKDAY(created) as day_of_week, 
DATE_FORMAT(created,'%W') name_of_day 
FROM visitors 
GROUP BY day_of_week,hour_of_day 
ORDER BY day_of_week,hour_of_day ASC 

いくつかのサンプルデータ

count hour_of_day day_of_week name_of_day 
    2  0   0   Monday 
    1  1   0   Monday 
    1  4   0   Monday 
    4  5   0   Monday 
    1  6   0   Monday 
    4  7   0   Monday 
    1  9   0   Monday 
    1  10   0   Monday 
    1  12   0   Monday 
    1  13   0   Monday 
    2  16   0   Monday 
    5  18   0   Monday 
    5  19   0   Monday 

問題 あなたが見ることができるように、データの多くの時間のために不足しているそこのデータ。そして、私は、[xの形式でデータを必要とするグラフを作成していて、X 、x、x、x、x、x]を24時間のタイムラインst私は最初の出力からarting、私は '0'になる欠けているものが必要です。

私はループでPHPの最後でそれを処理できますが、毎週&という週の毎日ループしていますが、1時間ごとにかなり面倒できれいにはなりません。

一時的なテーブルなしで(クエリ自体に24桁の数字などを含めるなど)可能ですか?

答えて

2

あまりにも綺麗ではありません。しかし、実際に一時表を使用できない場合は、このトリックを実行する必要があります。

select ifnull(count,0) as count,dh.hour_of_day, 
dh.day_of_week,date_format((date('2012-01-02') + interval dh.day_of_week day),'%W') as name_of_day 
from 
(
select day_of_week,hour_of_day 
from 
(
select 0 as day_of_week union select 1 union select 2 union select 3 
union select 4 union select 5 union select 6 
) d 
join 
(
select 0 as hour_of_day 
union select 1 union select 2 union select 3 union select 4 
union select 5 union select 6 union select 7 union select 8 
union select 9 union select 10 union select 11 union select 12 
union select 13 union select 14 union select 15 union select 16 
union select 17 union select 18 union select 19 union select 20 
union select 21 union select 22 union select 23 
) h 
) dh 
left outer join 
(
SELECT 
count(id) as count, 
HOUR(created) as hour_of_day, 
WEEKDAY(created) as day_of_week, 
DATE_FORMAT(created,'%W') name_of_day 
FROM visitors 
GROUP BY day_of_week,hour_of_day 
) v on dh.day_of_week = v.day_of_week and dh.hour_of_day = v.hour_of_day 
ORDER BY dh.day_of_week,dh.hour_of_day ASC; 

これで注意してください!複数の週に渡ってクエリを実行すると、複数の曜日が一緒に追加されます。 「今週だけ」の述語を追加することを検討してください。たとえば、元の選択肢にwhere yearweek(created) = yearweek(now())を追加すると、現在の週のデータだけが表示されます。

2

なぜ一時テーブルを使用したくないのかよくわからないので、人生がずっと楽になります。

ソリューションは、最高のここにレイアウトされている:http://www.freeopenbook.com/mysqlcookbook/mysqlckbk-chp-12-sect-10.html

は基本的にあなたが一日のすべての時間を持つテーブルを作成する必要があり、それに参加残ってしまいます。

+1

これは理論的に質問に答えるかもしれませんが、答えの本質的な部分をここに含め、参照のためのリンクを提供することが望ましいでしょう(http://meta.stackexchange.com/q/8259)。 (またリンクが壊れている) – Nanne

関連する問題