group by und order by
hotti
- datenbank
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
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
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