Vinzenz Mai: GROUP BY + ORDER BY

Beitrag lesen

Hallo

Dabei sollen die letzten Besucher oben stehen und jeder nur maximal einmal (Mehrfachbesuche werden also von den Usern nicht angezeigt, immer nur der letzte).

SELECT
*
FROM
profilbesucher
WHERE
besuch_bei=1
GROUP BY
besuch_von
ORDER BY
besuch_zeit
DESC

Das funktioniert soweit,

nur zeigt er mir beim ersten User oben z.B. eine Zeit an, wo er zwar auf dem Profil war, allerdings gibt es in der Tabelle schon einen wesentlich neueren Besuch von ihm...

Woran kann das liegen?

daran, dass Du MySQL verwendest.

Jedes andere mir bekannte Datenbankmanagementsystem (DBMS) weist Deine Abfrage
als mit einer Fehlermeldung zurück. Wenn Du die GROUP-BY-Klausel verwendest,
musst Du nach _jeder_ Spalte, auf die keine Aggregatsfunktion angewandt wird,
gruppieren. Daraus ergibt sich von selbst, dass Du im Normalfall nicht

SELECT *

verwenden kannst, weil Du dann ja eh' alle Spalten in der GROUP-BY-Klausel
aufführen musst.

Bist Du nur am Namen des Besuchers und seiner Besuchzeit interessiert, so
kommst Du mit einer einfachen Abfrage hin:

SELECT  
    besucher,  
    MAX(besuch_zeit),  
FROM profilbesucher  
WHERE besuch_bei = 1  
GROUP BY besucher  
ORDER BY MAX(besuch_zeit) DESC

siehe auch SELFHTML aktuell, Artikel Datensätze gruppieren mit SQL

Wenn Du noch weitere Informationen haben möchtest, die sich nicht durch eine
Aggregatsfunktion ermitteln lassen, dann ist eine korrelierte Unterabfrage das
Mittel der Wahl, siehe dazu dieses Archivposting von mir.

Freundliche Grüße

Vinzenz