2

次のデータを含むテーブルがあります。

UserName | LastLogin 
-------------------------------
User1    | 2010-10-25 10:05:47
User2    | 2010-10-23 11:10:27
User3    | 2010-10-12 05:39:34
User4    | 2010-10-20 12:22:11
User5    | 2010-09-17 08:41:05

クエリを実行して、過去 3 日間、過去 7 日間、および過去 21 日間にログインした人の数を取得できるようにしたいと考えています (これらの数字が重複することはわかっています)。次のようなクエリを実行することで、特定の値を取得できることがわかっています (構文は 100% 正しくない可能性があります)。

SELECT COUNT(*) 
  FROM login 
 WHERE LastLogin >= DATEDIFF(NOW(), LastLogin, INTERVAL 3 DAY);

1 つのクエリで 3 つの値すべてを返すクエリを実行できますか? GROUP BY は機能しますか? または、ネストされたクエリを使用できますか? 異なる間隔を指定してクエリを 3 回実行しても、同じくらい効率的ですか?

4

2 に答える 2

7

使用する:

SELECT SUM(CASE WHEN l.lastlogin >= DATE_SUB(CURRENT_DATE, INTERVAL 3 DAY) THEN 1 ELSE 0 END) AS within_3,
       SUM(CASE WHEN l.lastlogin >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY) THEN 1 ELSE 0 END) AS within_7,
       SUM(CASE WHEN l.lastlogin >= DATE_SUB(CURRENT_DATE, INTERVAL 21 DAY) THEN 1 ELSE 0 END) AS within_21
  FROM LOGIN l

NOW()には時間部分が含まれているため、NOW()ではなくCURRENT_DATEを使用しました。

于 2010-10-25T18:01:56.630 に答える
0
SELECT *
FROM   (SELECT COUNT(*) AS Last3Days FROM login WHERE LastLogin >= DATEDIFF(CURRENT_DATE, LastLogin, INTERVAL 3 DAY) a,
       (SELECT COUNT(*) AS Last7Days FROM login WHERE LastLogin >= DATEDIFF(CURRENT_DATE, LastLogin, INTERVAL 7 DAY) b,
       (SELECT COUNT(*) AS Last21Days FROM login WHERE LastLogin >= DATEDIFF(CURRENT_DATE, LastLogin, INTERVAL 21 DAY) c
于 2010-10-25T18:14:14.937 に答える