2010-10-25 2 views
2

У меня есть таблица со следующими данными:SQL - Получить значение в одном запросе с кратному где положениями

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, или я могу использовать вложенные запросы? Так же эффективно запускать запрос три раза с заданным интервалом?

ответ

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 

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

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 

 Смежные вопросы

  • Нет связанных вопросов^_^