2016-09-11 3 views
0

&グループデータをデータベースから日単位で選択する方法と、エントリのない日数が含まれています。その場合、値は0になります。MySql 1日あたりのデータ数を選択してカウントする - 空の日付を含める

PHPを使用できない場合は、PHPを使用することもできます。

SELECT DATE_FORMAT(date, '%Y-%m-%d') AS the_date 
    , COUNT(*) AS count 
    FROM table 
WHERE date BETWEEN DATE_FORMAT('2016-11-28', '%Y-%m-%d') AND DATE_FORMAT('2016-12-05', '%Y-%m-%d') 
GROUP 
    BY the_date 
+1

は 'show create table myTableName'の出力を示しています...あなたは' DATE'または 'DATETIME'形式ではないと思います。左結合のためにHelperテーブルが必要なように思えます。このヘルパーテーブルの回答を参照してください[Here](http://stackoverflow.com/a/37739514)。永久ヘルパーテーブルはスケールします。 – Drew

答えて

1

PHPで欠落している日付を追加する方が簡単かもしれません。ここで

は、私が現在持っているものです。 MySQLでは、どこかの日付を取得する必要があります。多くの場合、データベースにはこの情報を持つ「カレンダー」テーブルがあります。あなたは1を持っている場合は、このようなものは、あなたが欲しいものを行います。

SELECT DATE_FORMAT(c.date, '%Y-%m-%d') AS the_date, COUNT(t.date) AS count 
FROM Calendar c LEFT JOIN 
    table t 
    ON c.date = t.date 
WHERE c.date BETWEEN '2014-11-28' AND '2014-12-05' -- MySQL recognizes strings in the format of YYYY-MM-DD as dates when needed 
GROUP BY the_date; 

あなたは、このようなテーブルを持っていない場合は、クエリのための1つ作ることができます。

SELECT DATE_FORMAT(c.date, '%Y-%m-%d') AS the_date, COUNT(t.date) AS count 
FROM (SELECT date('2014-11-28') as date UNION ALL 
     SELECT date('2014-11-29') as date UNION ALL 
     SELECT date('2014-11-30') as date UNION ALL 
     SELECT date('2014-12-01') as date UNION ALL 
     SELECT date('2014-12-02') as date UNION ALL 
     SELECT date('2014-12-03') as date UNION ALL 
     SELECT date('2014-12-04') as date UNION ALL 
     SELECT date('2014-12-05') as date 
    ) c LEFT JOIN 
    table t 
    ON c.date = t.date 
GROUP BY the_date; 

をこれは、Aのために働きます少数の日付ですが、数ヶ月または数年にわたる範囲ではうまく動作しません。

+0

答えをくれてありがとう、私はカレンダーのソリューションに行ったが、テーブルに一致するものがなくても1を返します。しかし、完璧に他の機会に動作します! –

+0

'COUNT(*)'を 'COUNT(t.ID) 'に置き換えるように見える –

+0

もう1つの仕様は、テーブルに関連したWHEREの条件を持つ可能性のある方法ですが、テーブルのために。あなたは私の質問を理解したいと思います。 '%Y-%m-%d ')とDATE_FORMAT(' 2017-12-05 '、'%Y-%m-%d ')の間でrdfa_Calendar.dayがWHERE rdfa_Sessions.conversion =' true 'AND DATE_FORMAT(' 2014-11-28 ' %m-%d ') ' –

関連する問題