2011-12-21 6 views
1

私はstackoverflowで類似の質問を読んだことがありますが、OPのテーブル構造は決して私と同じではないので、答えは私には当てはまりません。私が読んだ投稿は、2つではなく1つの列でGROUP BYしようとしています。私は最新の安定版MySQLを使用しています。複数のパラメータが0を隠しているMySQL GROUP BY

は、ここに私のテーブル「参照」です:

id formatID referenceTime 
1  1   2011-6-12 12:40 
2  2   2011-6-12 1:04 
3  4   2011-6-12 1:03 
4  2   2011-6-12 15:20 
5  3   2011-6-12 9:30 
6  3   2011-6-12 2:55 
7  5   2011-6-12 13:15 
8  1   2011-6-12 12:32 
(etc) 


が、私は一日の時間によって発生した形式の各タイプのどれだけを表示するクエリを作成します。この点は、一番忙しい時刻が何であるかを確認することです。私はいくつかの簡単なグラフのWebアプリケーション(Highcharts.js)に使用できる出力を作成するクエリを記述しようとしています。私はそれが次のようになりたい:

Timeofday Subgroup Count 
12AM  1   2 
12AM  2   6 
12AM  3   7 
12AM  4   2 
12AM  5   0 
1AM  1   3 
1AM  2   3 
1AM  3   0 
1AM  4   0 
1AM  5   1 
(etc) 


私はこのクエリを使用しています:

SELECT date_format(referenceTime,'%I %p') AS timeofday, 
    reference.referenceFormatID AS subgroup, 
    count(*) AS count 
FROM reference 
GROUP BY timeofday,subgroup ASC 


をカウントがゼロに等しいので、終わるしかし、出力スキップ「行」

適切な形式のデータ系列を作成するには、これらのゼロが必要ですyアプリ。

私は2つの異なる列でグループ化しているので、すべての時間を2番目のテーブルに置くLEFT JOINメソッドは私にとっては機能しません。どうやらLEFT JOINの基準は、各時間が出力表にのと表示されている限り満足していますが、それぞれ時間がの形式で表示されます。

提案がありますか?

+0

と同様の方法を使用することができ、あなたはDUAL表は、ルックアップ使用してそれを実行しようとした場合

SELECT hours.timeofday, formats.ID, count(reference.subgroup) FROM hours JOIN formats LEFT JOIN reference on date_format(referenceTime,'%I %p') = hours.timeofday AND reference.subgroup = formats.ID GROUP BY hours.timeofday,formats.ID ASC 

を登録しようLEFTに追加しますブライアン・フーバーのポストの – penco

答えて

2

可能な時間を含むルックアップテーブルを作成するか、デュアルテーブルとユニオンを含む奇妙なクエリを使用して、探している値を取得するかの2つの方法があります。

最初のケースでは、現時点では1つのフィールドしかないかもしれないテーブルがあります。時間を呼び出し、フィールドはtimeofdayです。時間のTIMEOFDAYで

、あなたは以下のデータだろう:

timeofday 
12AM 
1AM 
2AM 
.... 

を次に、あなたのクエリは、すべての組み合わせを取得するには、[編集]

SELECT hours.timeofday, reference.referenceFormatID AS subgroup, count(reference.referenceFormatID) AS count FROM hours LEFT JOIN reference on date_format(referenceTime,'%I %p') = hours.timeofday GROUP BY hours.timeofday,subgroup ASC 

と同じくらい簡単です、あなたrfausakで言及されているように、すべての可能なformatIDを持つフォーマットテーブルも必要です。別の方法でこれを行うこともできますが、このテーブルがあると仮定して、それをフォーマットと呼んでみましょう。ここでも、この表は単一の列を持つことができます。

第1部では、すべての組み合わせを得ることです:

SELECT hours.timeofday, 
     formats.ID 
from hours 
join formats 

これはデカルトであることが、すべての可能な時間とフォーマットIDをマージします参加。

は、今、私たちは、あなたが一番下にある最後のクエリを使用して解決generate days from date range

+1

3番目のオプションは、プログラミング言語を使用することです。また、彼は彼が望むすべての結果をリストするために 'formats'テーブルが必要だと思います。 –

+1

あなたが私に与えたクエリは、レコードがなくても何時間もゼロ行を生成しますが、1時間ごとにすべてのサブグループに対してゼロ行が生成されるわけではありません。それは理にかなっていますか? – penco

+0

それは働いた!あなたはその日、友人を救った。私は決してそれを考え出さなかったでしょう。デカルト結合が何であるかを調べる必要があります。あなたがまだ周りにいるなら、count(reference.subgroup)が最初に持っていたカウント(*)と機能的にどのように異なっているのかを私に説明できますか? – penco

関連する問題