ip groupieren und neusestes Datum ausgeben (mysql)
Holgerlein
- datenbank
Ich möchte eine eigene Statistik haben, dazu speichere ich bei jedem Seitenabruf die IP und das Datum, Uhrzeit.
Jetzt möchte ich gerne sehen wer gerade online ist, bzw. die letzten 10 Minuten.
Meine Idee ist folgende, ich groupiere einfach die IP'S und alasse mir die IPs ausgeben die die letzten 10 Minuten online waren. Doch mein Problem ist das sortieren innerhalb einer groupierung?
select ip, DATE_FORMAT(date,'%d.%m.%Y %H.%i.%s') datum from statistik GROUP BY ip ORDER by date ASC
Jetzt werden die Groupierten IPS zwar nach datum sortiert, doch sollten sie auch vor her, also beim groupieren, schon nach Datum sortiert werden!!!
Holger
Hallo,
Meine Idee ist folgende, ich groupiere einfach die IP'S und alasse mir die IPs ausgeben die die letzten 10 Minuten online waren. Doch mein Problem ist das sortieren innerhalb einer groupierung?
ja, das ist ein typisches MySQL-Problem. MySQL ist am wenigsten geeignet, um den Umgang mit GROUP BY und Aggregatsfunktionen zu lernen.
select ip, DATE_FORMAT(date,'%d.%m.%Y %H.%i.%s') datum from statistik GROUP BY ip ORDER by date ASC
Es ist ganz einfach. Auf Dein Datum wendest Du eine Aggregatsfunktion an. Das ist das, was andere DBMS zwingend verlangen. Du möchtest den neuesten Zeitpunkt zu jeder IP. Wunderbar, nutze einfach MAX() und formatiere diesen Wert wie gehabt mit DATE_FORMAT:
SELECT
ip,
DATE_FORMAT([link:http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_max@title=MAX](date), '%d.%m.%Y %H.%i.%s')) datum
FROM
statistik
GROUP BY
ip
Du möchtest nur diejenigen, die in den letzten 10 Minuten einen Eintrag hatten? Schränke die zu betrachtenden Datensätze mit der WHERE-Klausel ein. Das kriegst Du bestimmt selbst hin.
Freundliche Grüße
Vinzenz
Danke erst mal,
ich habe zur Überprüfung eine ID dazugemacht die per auto_increment gefüllt wird.
Die Abfrage klappt soweit, doch ein Fehler ist da noch und zwar die ID.
Wenn ich folgende Daten habe:
10 10:30 100.100.100.100
11 10:31 100.100.100.100
12 10:32 100.100.100.100
13 10:33 100.100.100.100
wird die letzte Ausgegeben, doch mit der ID von der ersten
SELECT id, ip, DATE_FORMAT( MAX( date ) , '%d-%m-%Y %H.%i.%s' ) AS datum
FROM statistik
WHERE date > DATE_SUB( NOW( ) , INTERVAL 10 MINUTE )
GROUP BY ip
ORDER BY date DESC
Kannst du mir vieleicht sagen an was das liegen kann?
Holger
Hi,
Die Abfrage klappt soweit, doch ein Fehler ist da noch und zwar die ID.
Wenn ich folgende Daten habe:
10 10:30 100.100.100.100
11 10:31 100.100.100.100
12 10:32 100.100.100.100
13 10:33 100.100.100.100wird die letzte Ausgegeben, doch mit der ID von der ersten
SELECT id, ip, DATE_FORMAT( MAX( date ) , '%d-%m-%Y %H.%i.%s' ) AS datum
FROM statistik
WHERE date > DATE_SUB( NOW( ) , INTERVAL 10 MINUTE )
GROUP BY ip
ORDER BY date DESC
>
> Kannst du mir vieleicht sagen an was das liegen kann?
Daran, dass du Spalten selektierst, die nicht Bestandteil der Gruppierung sind, was nach SQL-Standard verboten ist (das hatte Vinzenz schon angedeutet), von MySQL (bei entsprechend lascher Konfiguration) aber toleriert wird - mit dem explizit in Kauf genommenen Nebeneffekt, dass dir der Spalteninhalt aus einem „zufälligen“ Datensatz geliefert wird.
MfG ChrisB
--
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
und wäre es korrekt, wenn man dann ID auch in ein MAX setzen würde?
...was das richtige Ergebniss liefert?
MAX(id)
SELECT MAX(id), ip, DATE_FORMAT( MAX( date ) , '%d-%m-%Y %H.%i.%s' ) AS datum
FROM statistik
WHERE date > DATE_SUB( NOW( ) , INTERVAL 10 MINUTE )
GROUP BY ip
ORDER BY date DESC
Holger
Hallo,
und wäre es korrekt, wenn man dann ID auch in ein MAX setzen würde?
...was das richtige Ergebniss liefert?
das liefert nicht gesichert das richtige Ergebnis.
SELECT MAX(id), ip, DATE_FORMAT( MAX( date ) , '%d-%m-%Y %H.%i.%s' ) AS datum
FROM statistik
WHERE date > DATE_SUB( NOW( ) , INTERVAL 10 MINUTE )
GROUP BY ip
ORDER BY date DESC
Korrelierte Unterabfragen liefern es hingegen.
Freundliche Grüße
Vinzenz
Hallo,
ich habe zur Überprüfung eine ID dazugemacht die per auto_increment gefüllt wird.
Die Abfrage klappt soweit, doch ein Fehler ist da noch und zwar die ID.
das ist eine neue Anforderung :-)
10 10:30 100.100.100.100
11 10:31 100.100.100.100
12 10:32 100.100.100.100
13 10:33 100.100.100.100wird die letzte Ausgegeben, doch mit der ID von der ersten
mit einer zufälligen.
SELECT id, ip, DATE_FORMAT( MAX( date ) , '%d-%m-%Y %H.%i.%s' ) AS datum
FROM statistik
WHERE date > DATE_SUB( NOW( ) , INTERVAL 10 MINUTE )
GROUP BY ip
ORDER BY date DESC
>
> Kannst du mir vieleicht sagen an was das liegen kann?
An MySQL. Andere DBMS geben Dir bei dieser Abfrage eine Fehlermeldung aus, aber kein Ergebnis. Ich finde das Verhalten der anderen DBMS gut. MySQL läßt sich so konfigurieren, dass MySQL ebenfalls einen Fehler meldet, leider ist das nicht die Standardkonfiguration. Aus Kompatibiliätsgründen läuft MySQL in der Konfiguration "so-wie-es-MySQL-Benutzer-gewohnt-sind".
Und deswegen daran, dass Du für dieses erweiterte Problem eine korrelierte Unterabfrage verwenden solltest, siehe z.B. [diesen Archivbeitrag](/archiv/2006/7/t133015/#m861544).
Freundliche Grüße
Vinzenz