hotti: group by und order by

Mahlzeit,

meine Tabelle ist ein vereinfachtes log vom Server mit den Spalten
url, ref, ts

(url der Seite, referrer und Zeitstempel)

Bei jedem Aufruf einer Seite kommt also ein neuer Record hinzu.

Anzeigen möchte ich die URLs, die jeweilige Anzahl der Aufrufe und die jeweilige Zeit des letzten Zugriffs.

Mein Ansatz:
SELECT url, count(url) as cnt, ts FROM log GROUP BY url ORDER BY ts DESC

Das zeigt url, cnt korrekt, jedoch der Zeitstempel ist nicht der vom letzten Zugriff: Es wird 'irgendeine' Zeit angezeigt, das "ORDER BY" ts wird quasi ignoriert.

Bitte mal um Hilfe zum SQLstatement, womit exakt die Zeit des letzten Zugriffs mitgeliefert wird. Inner JOIN?

Hotte

--
Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  1. yo,

    SELECT url, count(url) as cnt, ts FROM log GROUP BY url ORDER BY ts DESC

    dein dbms scheint mysql zu sein und du bist auf den hier vielfach diskutierten "mysql GROUP BY bug" hereingefallen. grundsätzlich gilt, dass du nur spalten ausgeben kannst, über die du auch gruppiert hast, bzw. die eine aggregatfunktion beinhalten. der grund dafür liegt in der grupierung selbst, du fügst halt mehrere dinge zu einer gruppe zusammen.

    mysql gweht dort einen anderen weg, aus performancegründen lassen sie auch spalten in der ausgabe zu, über die du nicht gruppiert hast und die keine aggregat-funktion sind. in deinem falle ist das die spalte ts. da du über die spalte nicht gruppiert hast (was auch richtig ist), nimmt mysql eben einen zufälligen wert der in der jeweiligen gruppierung enthalten ist, muss sich ja für einen entscheiden. abhilfe für dich ist einfach, lege die aggregat-funktion MAX um die ts spalte.

    SELECT url, count(url) cnt, MAX(ts) Maxdatum
    FROM log
    GROUP BY url
    ORDER BY MAX(ts) DESC
    ;

    Ilja

    1. hi mei Lieba,

      SELECT url, count(url) cnt, MAX(ts) Maxdatum
      FROM log
      GROUP BY url
      ORDER BY MAX(ts) DESC
      ;

      Vielen Dank für Deinen Tipp mit MAX()!! Ich hab das ein bischen korrigiert und siehe das da

      SELECT url, count(url) , max(ts)
      FROM log
      GROUP BY url

      tut gut. Kein Join, Mann, bin ich froh ;-)

      Hotte

      --
      Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.