2010-10-25 4 views
2

J'ai une table avec les données suivantes:SQL - Récupérer des valeurs dans une seule requête avec plusieurs où les clauses

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 

Je veux être en mesure d'exécuter une requête pour obtenir le nombre de personnes qui se sont connectés dans les 3 derniers jours, les 7 derniers jours et les 21 derniers jours (je sais que ces chiffres se chevaucheront). Je sais que je peux obtenir chaque valeur particulière en exécutant une requête comme (syntaxe ne peut pas être 100% correct):

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

Puis-je exécuter une requête pour renvoyer les trois valeurs dans une requête? Est-ce qu'un GROUP BY fonctionnera, ou est-ce que je peux utiliser des requêtes imbriquées? Est-il tout aussi efficace d'exécuter la requête trois fois avec l'intervalle spécifié?

Répondre

7

Utilisation:

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 

J'utilisé CURRENT_DATE plutôt que NOW() parce NOW() comprend la partie de temps.

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 
Questions connexes