2016-07-20 6 views
2

のようなデータを持つテーブルがあります:のMySQL:日付範囲の間のすべての日付を選択し、テーブルのデータが一致します日付

----------------------- 
| id | date | 
----------------------- 
| 1 | 2016-07-11 | 
| 2 | 2016-07-11 | 
| 3 | 2016-07-15 | 
| 4 | 2016-07-15 | 
| 5 | 2016-07-15 | 
| 6 | 2016-07-16 | 
| 7 | 2016-07-19 | 
| 8 | 2016-07-20 | 
----------------------- 

私は日付の範囲(すべての日付)とIDの数を取得したいですレコードが存在しない場合は0を返します。 2016年7月20日に2016年7月10日の間の日付のために実行した場合

、結果は次のようになります。

-------------------------- 
| date | count(id) | 
-------------------------- 
| 2016-07-10 |  0  | 
| 2016-07-11 |  2  | 
| 2016-07-12 |  0  | 
| 2016-07-13 |  0  | 
| 2016-07-14 |  0  | 
| 2016-07-15 |  3  | 
| 2016-07-16 |  1  | 
| 2016-07-17 |  0  | 
| 2016-07-18 |  0  | 
| 2016-07-19 |  1  | 
| 2016-07-20 |  1  | 
-------------------------- 

私はgetting a date rangeのためのソリューションを見つけたが、どのように見つけ出すことができませんでしたテーブル内の日付のIDを数えます。

ありがとうございます!

+0

集計関数 "Count"を使用して、選択クエリを使用して、特定の日付のレコードを数えないようにすることができます。 –

+0

恒久的な毎日または毎月の[ヘルパーテーブル](http://stackoverflow.com/a/37739514)を1度作成し、頻繁に使用します。毎回それらを一緒にハッキングする、はるかに高速な結合を行います。 – Drew

+0

ドリュー、本当ですか? – Strawberry

答えて

4

として範囲でどこ条件は、私はすべての日付を取得するためのソリューションで与えられたクエリを変更することによって、これを考え出しました。

次のクエリは、すべての日付を返し、IDの数がすべてのレコードが存在する場合:日付の範囲を取得するための

select d.date, count(v.id) from 
(select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) date from 
(select 0 i 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) t0, 
(select 0 i 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) t1, 
(select 0 i 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) t2, 
(select 0 i 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) t3, 
(select 0 i 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) t4) d 
left join visitors v on d.date = v.date 
where d.date between '2016-06-01' and '2016-06-30' 
group by d.date 
order by d.date 

礼儀@mark-bannisterに行くと簡単な結果のためのクエリマッチングに参加、およびソート解決策を得る。

-1

単に、

WHERE `date` BETWEEN '2016-07-10' AND '2016-07-20' 
+0

データに存在しない日付も追加したい – AliIshaq

+0

'NULL'チェックを追加する:' WHERE(d.date BETWEEN '2016-07-10' AND '2016-07-20' OR d.date IS NULL) ' – redolent

+0

それだけでは助けにならないでしょう – Strawberry

0

は、あなたが希望する結果を得るのを助けるだろう必要とされていることにより、以下、基本的にグループを試してみてください。また、必要に応じて

SELECT date ,count(date) from datetable group by date; 
+0

レコードが存在しない場合でも、範囲内のすべての日付を取得することについての部分が欠落しています。 – AliIshaq

+0

私は、必要に応じてどこの条件を書くことができると言いました、これはあなたが苦労していた部分ではないと思いました:) –

関連する問題