elf7013: Tabelle gruppieren und sortieren

Hallo,

Hallo,

in einer Tabelle habe ich Webserverlogdaten eingelesen:
log (
id
ip
timestamp
datetime
date
time
...
)

Ich möchte nun die Daten so auslesen, dass die Tabelle nach der "ip" gruppiert ist und innerhalb der Gruppe anhand der Zeit (zB timestamp) sortiert ist.

Dies soll im Weiteren dazu genutzt werden, klassisch die Verweildauer eines Besuches zu bestimmen, welche ich anschliessend noch in einem Skript weiterverarbeiten möchte.

Ich hatte es mit:
SELECT * FROM log GROUP BY ip ORDER BY timestamp
versucht.

Vielleicht kann mir jemand bei der Formulierung des Statments helfen?

Danke!

  1. Hello,

    innerhalb der Gruppe anhand der Zeit (zB timestamp) sortiert ist.

    OK

    Ich möchte nun die Daten so auslesen, dass die Tabelle nach der "ip" gruppiert ist

    das wiederum kann ich mir schwer vorstellen, weil...

    SELECT * FROM log GROUP BY ip ORDER BY timestamp

    was ist deiner Meinung nach der korrekte Wert für ID? Wenn du GROUP BY "ip" absetzt, erscheinen (theoretisch) alle Datensätze mit der selben IP als ein Datensatz. Damit besteht ein Konflikt bei allen nicht-gruppierten Spalten (ID, date, time, timestamp, ...) - die Werte werden sich ja für jeden Eintrag unterscheiden - welchen Wert davon hättest du gerne?

    Vielleicht erleichtert es die Lösungsfindung, wenn du Beispieldaten und gewünschtes Ergebnis nennst, dann wirst du dir auch selber darüber klar, welche Daten du brauchst.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    "I wish it need not have happened in my time" - "So do I, and so do all who live to see such times. But that is not for them to decide. All we have to decide is what to do with the time that is given us."  --  J.R.R. Tolkien: "The Lord Of The Rings: The Fellowship Of The Ring"
    1. OK.

      Versuchen wir das ganze mit Beispieldaten:
      Hier der Einfachheit mit nur zwei Spalten

      IP------------------------timestamp
      100.100.100.100-----------1
      100.100.100.100-----------2
      100.100.100.100-----------3
      100.100.100.0-------------1
      100.100.100.100-----------4
      100.100.100.0-------------1
      100.100.100.100-----------6
      100.100.100.0-------------1
      100.100.100.0-------------10
      100.100.100.0-------------4
      100.100.100.0-------------7
      100.100.100.0-------------5

      Ergebnis
      100.100.100.0-------------1
      100.100.100.0-------------1
      100.100.100.0-------------4
      100.100.100.0-------------5
      100.100.100.0-------------7
      100.100.100.0-------------10
      100.100.100.100-----------1
      100.100.100.100-----------2
      100.100.100.100-----------3
      100.100.100.100-----------4
      100.100.100.100-----------6

      Das Ergebnis ist also eine sortierte Liste sowohl nach unterschiedlichen IPs und der Zeit. Die Einträge der verschiedenen IPs werden also chronologisch (auf oder absteigend sortiert) ausgegeben.

      1. Ergebnis
        100.100.100.0-------------1
        100.100.100.0-------------1
        100.100.100.0-------------4
        100.100.100.0-------------5
        100.100.100.0-------------7
        100.100.100.0-------------10
        100.100.100.100-----------1
        100.100.100.100-----------2
        100.100.100.100-----------3
        100.100.100.100-----------4
        100.100.100.100-----------6

        Das ist dann aber bei der IP kein Group By sondern auch ein Order By.

        Group By würde alle 100.100.100.0 zusammenfassen zu einem was sich dann (wie Rouven auch schon gesagt hat) mit der sortierung der id nicht vertragen würde

        gruß miku

        1. Das ist dann aber bei der IP kein Group By sondern auch ein Order By.

          Dementsprechend sollte ich folgendes probieren (wenn das Interface wieder funktioniert...)?
          SELECT * FROM log ORDER BY ip, timestamp

          1. Das ist dann aber bei der IP kein Group By sondern auch ein Order By.

            Dementsprechend sollte ich folgendes probieren (wenn das Interface wieder funktioniert...)?
            SELECT * FROM log ORDER BY ip, timestamp

            So würd ichs mal probieren.
            Hier findest du das auch schön erklärt mit Beispielen

            gruß miku

            1. Das ist dann aber bei der IP kein Group By sondern auch ein Order By.

              Dementsprechend sollte ich folgendes probieren (wenn das Interface wieder funktioniert...)?
              SELECT * FROM log ORDER BY ip, timestamp

              So würd ichs mal probieren.
              Hier findest du das auch schön erklärt mit Beispielen

              gruß miku

              Die Seite erklärt leider nur den simplen Syntax. Sucht man aber im Netz finden sich in der Tat Beispiele für mehrere Angaben im Rahmen des ORDER BY Statements.

              1. Die Seite erklärt leider nur den simplen Syntax. Sucht man aber im Netz finden sich in der Tat Beispiele für mehrere Angaben im Rahmen des ORDER BY Statements.

                Steht aber genau das Beispiel drin das du laut deinem Befehl auch suchst ;)
                (Ja, ist aber eher kurz zusammengefasst, das stimmt)

                Zitat:

                Es besteht die Möglichkeit, nach mehr als einer Spalte zu sortieren. In diesem Fall sieht die ORDER BY-Klausel wie folgt aus:

                ORDER BY "Spalten_Name1" [ASC, DESC], "Spalten_Name2" [ASC, DESC]

                gruß

          2. echo $begrüßung;

            Das ist dann aber bei der IP kein Group By sondern auch ein Order By.
            Dementsprechend sollte ich folgendes probieren (wenn das Interface wieder funktioniert...)?
            SELECT * FROM log ORDER BY ip, timestamp

            Auch solltest du dir die Funktion INET_ATON() ansehen, damit du deine IP-Adressen nummerisch und nicht nach String sortieren kannst.

            echo "$verabschiedung $name";