Holgerlein: ip groupieren und neusestes Datum ausgeben (mysql)

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

  1. 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

    1. 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

      1. 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.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?  
          
        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?
        
        1. 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

          1. 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
            
      2. 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.100

        wird 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