SELECT COUNT(*) FROM `table` WHERE `datetime` > SUBDATE(NOW(), INTERVAL 1 DAY)
これは、最終日のエントリ数を取得します。しかし、このクエリのバリエーションを複数回送信しなくても、複数の間隔のエントリ数を取得することは可能ですか(INTERVAL 1 DAY
、INTERVAL 1 WEEK
、INTERVAL 1 MONTH
、...)?単一クエリを使用して複数の日付間隔ごとにエントリ数を取得する
SELECT COUNT(*) FROM `table` WHERE `datetime` > SUBDATE(NOW(), INTERVAL 1 DAY)
これは、最終日のエントリ数を取得します。しかし、このクエリのバリエーションを複数回送信しなくても、複数の間隔のエントリ数を取得することは可能ですか(INTERVAL 1 DAY
、INTERVAL 1 WEEK
、INTERVAL 1 MONTH
、...)?単一クエリを使用して複数の日付間隔ごとにエントリ数を取得する
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)
期待される出力は? – 1000111
たとえば、1列の3行。各行は、日、週、および月のエントリ数を持ちます。 – Martin
「最終日、先週、先月」のような3列の行を1行取得すればどうなるでしょうか? – 1000111