2016-08-01 6 views
1
SELECT COUNT(*) FROM `table` WHERE `datetime` > SUBDATE(NOW(), INTERVAL 1 DAY) 

これは、最終日のエントリ数を取得します。しかし、このクエリのバリエーションを複数回送信しなくても、複数の間隔のエントリ数を取得することは可能ですか(INTERVAL 1 DAYINTERVAL 1 WEEKINTERVAL 1 MONTH、...)?単一クエリを使用して複数の日付間隔ごとにエントリ数を取得する

+0

期待される出力は? – 1000111

+0

たとえば、1列の3行。各行は、日、週、および月のエントリ数を持ちます。 – Martin

+0

「最終日、先週、先月」のような3列の行を1行取得すればどうなるでしょうか? – 1000111

答えて

2

CASE WHEN表現が必要です。

SELECT 
    COUNT(CASE WHEN DATE(`datetime`) >= CURDATE() - INTERVAL 1 DAY AND DATE(`datetime`) < CURDATE() THEN 1 END) AS lastDay, 
    COUNT(CASE WHEN DATE(`datetime`) >= CURDATE() - INTERVAL 7 DAY AND DATE(`datetime`) < CURDATE() THEN 1 END) AS lastSevenDays, 
    COUNT(*) AS lastThirtyDays 
FROM `table` 
WHERE 
DATE(`datetime`) >= CURDATE() - INTERVAL 30 DAY 

How to use CASE WHEN expression

注:あなたの要件は、このクエリで行く最後の日、最後の7日間と過去30日間の結果を取得する場合。

EDIT:あなたはdatetimeフィールドにインデックスを持っている場合は

はその後、上記のクエリは、そのインデックスを使用して失敗します。 datetimeのインデックスを利用するには、下記のクエリを使用してください。

SELECT 
    COUNT(CASE WHEN DATE(`datetime`) >= CURDATE() - INTERVAL 1 DAY AND DATE(`datetime`) < CURDATE() THEN 1 END) AS lastDay, 
    COUNT(CASE WHEN DATE(`datetime`) >= CURDATE() - INTERVAL 7 DAY AND DATE(`datetime`) < CURDATE() THEN 1 END) AS lastSevenDays, 
    COUNT(*) AS lastThirtyDays 
FROM `table` 
WHERE 
`datetime` >= (NOW() - INTERVAL 30 DAY - INTERVAL HOUR(NOW()) HOUR - INTERVAL MINUTE(NOW()) MINUTE - INTERVAL SECOND(NOW()) SECOND) 
+1

1つには3つのSQLを持っていると賢明です – SIDU

+0

私はまだdocs(https://mariadb.com/kb/en/mariadb/case-statement/)を読んでいますが、最後の 'COUNT'は' COUNT(*) '先月に 'どこで '選んだのか。 – Martin

+0

あなたは正しいです。 30日以降、条件の全域をカバーするので、その代わりに 'COUNT(*) 'を使うことができます。それを修正しました。 – 1000111

関連する問題