2012-04-10 4 views
1

J'ai une table login_log: enter image description hereGroupe par date Clusters

Et je suis en train de construire une requête groupée connexions "uniques" baseed sur login_email, login_success, login_email, account_type_id, login_lock, login_ip

donc jusqu'à présent je

SELECT count(*) count, MAX(login_date) date, login_ip, login_email, account_type_id, login_lock, login_success 
FROM `login_log` 
GROUP BY login_email, login_success, login_email, account_type_id, login_lock, login_ip 
ORDER BY date DESC 

Ce qui me reçoit: enter image description here

Mais prendre la ligne 5 et 6 par exemple. Sur 6, l'utilisateur a échoué à la connexion 3 fois avant une connexion réussie sur la ligne 5. Le compte de la ligne 5 devrait indiquer 1 mais il regroupe les connexions réussies avant les tentatives infructueuses. Ce que je veux est une ligne avec le login réussi, une ligne avec le login échoué, puis une ligne avec un login réussi, trié par date.

Comment est-ce que je peux grouper la requête de date de sorte qu'ils ne "sautent" pas l'un l'autre?

Répondre

1

Le problème avec votre requête est que vous ne regroupez pas par Date dans la section Grouper par. Par conséquent, votre compte (*) augmente inutilement.

Ajout:

Group By Date 

fonctionnera, mais pourrait ne pas vous donner l'intervalle correct. Ajout de la fonction Date de MySQL() vous permettra de le diviser par jour, donc vous devez ajouter:

Group By Date(Date) 

Vous pouvez également changer votre alias date à un mot-clé MySQL non réservé, comme LogDate ou quelque chose de similaire .

En savoir plus sur les fonctions Date de MySQL/Heure: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

+0

Si le groupe I par date je pourrais aussi bien ne pas du tout groupe. L'idée est de dire que 3 tentatives de connexion échouées les unes après les autres seraient groupées, mais si une réussite se produisait entre, elle retournerait 3 lignes, compterait 2 => échouer, compter 1 => succès, compter 1 => échouer –

+0

Je vois ce que tu veux dire. Il semble que vous ayez besoin d'un intervalle qui change avec login_success. Je ne sais pas comment faire cela en pure MySQL. Cela peut être un bon début cependant: [link] (http://www.artfulsoftware.com/infotree/queries.php?&bw=1280#798) - il vous indique comment identifier les lignes qui diffèrent des rangs immédiatement précédents que vous décrit ci-dessus – citizenen

+0

en utilisant Date() est un correctif rapide et suffisant pour l'instant. –