2010-08-18 4 views
0

J'ai une table appelée user_logins qui suit les connexions utilisateur dans le système. Il dispose de trois colonnes, login_id, user_id et login_timeMois de regroupement MySQL basé sur TIMESTAMP

login_id(INT) | user_id(INT) | login_time(TIMESTAMP) 
------------------------------------------------------ 
    1  |  4  | 2010-6-14 08:54:36 
    1  |  9  | 2010-7-16 08:56:36 
    1  |  9  | 2010-8-16 08:59:19 
    1  |  9  | 2010-8-16 09:00:24 
    1  |  1  | 2010-8-16 09:01:24 

Je cherche à écrire une requête qui déterminera le nombre de connexions uniques pour chaque jour et compter que pour chaque mois. Si dans un jour un utilisateur s'est connecté deux fois, il ne sera compté qu'une seule fois. L'exemple de sortie serait le suivant

month(VARCHAR) | logins(INT) 
--------------------------- 
June  |  1 
July  |  1 
August  |  2 

dans le résultat tableau Août a seulement 2 parce que le user_id 9 connecté deux fois par jour et l'exploitation forestière dans le système ne compte que 1 connexion pour ce jour-là. Avec l'aide du débordement de pile j'ai écrit une requête qui réalise ceci mais pour une raison quelconque quand j'utilise la fonction DATE_FORMAT avec juste '% M' quand j'essaye de lire les valeurs dans Java en utilisant Hibernate cela provoque l'objet à corrompre et non reconnu comme une chaîne. Je suppose que c'est probablement parce que ma requête fait quelque chose de mal. Ma question est la suivante:

SELECT login_date, SUM(logins) as numLogins FROM (
    SELECT 
     DATE_FORMAT(DATE(login_time), '%M') AS login_date, 
     COUNT(DISTINCT login_id) AS logins 
    FROM user_logins 
    WHERE login_time > DATE_SUB(NOW() - INTERVAL 1 YEAR) 
    GROUP BY DATE(login_time)) 
AS Z GROUP BY(login_date)"; 
+0

Je ne sais pas si elle est une faute de frappe ici, ou si vous avez copié le code, mais le SQL vous a « frmo » au lieu de « FROM » sur à la fin de la première ligne. – gabe3886

+0

oui juste une faute de frappe de ma part édité. – IamBanksy

Répondre

1

Pourquoi ne pas utiliser l'extraction (mois depuis login_time) pour obtenir le mois comme une valeur numérique?

 
SELECT extract(month from login_time), 
     COUNT(DISTINCT login_id) AS logins 
FROM user_logins 
WHERE login_time > DATE_SUB(NOW() - INTERVAL 1 YEAR) 
GROUP BY extract(month from login_time) 
+0

qui me donne une erreur de syntaxe, je n'étais pas au courant de la méthode d'extraction. – IamBanksy

+0

Fonctionne avec MySQL 5.0 –