SQL - извлечение значений в одном запросе с несколькими предложениями where - PullRequest
2 голосов
/ 25 октября 2010

У меня есть таблица со следующими данными:

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);

Могу ли я выполнить запрос, чтобы вернуть все три значения в одном запросе? Будет ли работать GROUP BY, или я могу использовать вложенные запросы? Так же эффективно выполнить запрос три раза с указанным другим интервалом?

Ответы [ 2 ]

7 голосов
/ 25 октября 2010

Использование:

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

Я использовал CURRENT_DATE, а не NOW (), потому что NOW () включает часть времени.

0 голосов
/ 25 октября 2010
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
...