2012-04-10 2 views
1

Ich habe eine login_log Tabelle: enter image description hereGruppe von Rispendatteln

Und ich versuche, eine Abfrage gruppiert „einzigartig“ Logins auf login_email, login_success, login_email, account_type_id, login_lock, login_ip

Also bisher habe ich

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 
baseed zu bauen

Was ich bekommt: enter image description here

Aber nimm Reihe 5 und 6 zum Beispiel. Bei 6 hat der Benutzer die Anmeldung dreimal fehlgeschlagen, bevor er in Zeile 5 erfolgreich abgeschlossen wurde. Die Zählung der Zeile 5 sollte 1 lauten, es werden jedoch erfolgreiche Anmeldungen vor den fehlgeschlagenen Versuchen gruppiert.

Was ich will ist eine Zeile mit der erfolgreichen Anmeldung, eine Zeile mit der fehlgeschlagenen Anmeldung, dann eine Zeile mit einer erfolgreichen Anmeldung, nach Datum sortiert.

Wie kann ich die Datumsabfrage so gruppieren, dass sie sich nicht gegenseitig "springen"?

Antwort

1

Das Problem mit Ihrer Abfrage ist, dass Sie nicht nach Datum im Abschnitt Gruppieren nach gruppieren. Als Ergebnis wird Ihr Count (*) unnötig erhöht.

Hinzufügen:

Group By Date 

funktioniert, aber könnten Sie nicht das korrekte Intervall geben. Hinzufügen des MySQL Date() Funktion erlaubt es dir, es von Tag zu spalten, so würden Sie hinzufügen:

Group By Date(Date) 

Vielleicht haben Sie auch wollen Ihre Alias ​​Datum auf einen nicht reservierten MySQL Schlüsselwort ändern, wie LogDate oder etwas ähnliches .

Mehr zu den MySQL-Datum/Zeit-Funktionen: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

+0

Wenn ich Gruppe von Datum könnte ich auch nicht Gruppe überhaupt. Die Idee ist, dass 3 fehlgeschlagene Anmeldeversuche nacheinander gruppiert werden, aber wenn ein erfolgreicher dazwischen kommt, würde es 3 Zeilen zurückgeben, zählen 2 => fehlgeschlagen, zählt 1 => Erfolg, zählt 1 => fehlgeschlagen –

+0

Ich verstehe was du meinst. Offenbar benötigen Sie ein Intervall, das sich mit login_success ändert. Nicht sicher, wie man das in reinem MySQL macht. Das könnte aber ein guter Anfang sein: [link] (http://www.artfulsoftware.com/infotree/queries.php?&bw=1280#798) - es zeigt Ihnen, wie Sie Zeilen identifizieren, die sich von _unvorhergehenden Zeilen_ unterscheiden wie Sie oben beschrieben – citizenen

+0

mit Date() ist eine schnelle, nah genug-Fix für jetzt. –