MySQL GROUP BY & MAX()
Chrisi
- css
Hallo zusammen,
ich habe mal wieder ein Problem beim Sortieren/Selecten von Daten aus meiner Datenbank.
Es gibt eine Tabelle in der Bewertungen gespeichert werden, aus dieser möchte ich immer die letzten 5 auslesen, soweit kein Problem :)
Nun ist es aber so das in den meisten fällen mehrere Bewertungen am Stück kommen die zu einem Anbieter (AID) gehören, was natürlich unter einer Auswertung der letzten 5 nicht schön aussieht.
Daher soll er mir die Bewertungen anhand der "AID" Gruppieren und immer nur die letzte (aktuellste) Bewertung anzuzeigen.
Die Tabelle beinhaltet 3 Spalten:
BID = Die eindeutige ID für die Bewertung (auto increment)
AID = Anbieter ID (int)
datum = MySQL Tinmestamp
So schaut meine Technik aus :)
SELECT MAX(b.BID),MAX(DATE_FORMAT(b.datum,'%d.%m')) AS zeit
FROM bewertung AS b
GROUP BY b.AID
ORDER BY b.BID DESC
LIMIT 5
Die Abfrage gruppiert mir alles schön, aber ordnet nicht nach dem aktuellsten Eintrag, sondern kreuz und quer :)
Kann mir da vieleicht jamand sagen wie ichs hinbekommen kann ?
Viele Grüße und danke, Chrisi
yo,
SELECT MAX(b.BID),MAX(DATE_FORMAT(b.datum,'%d.%m')) AS zeit
FROM bewertung AS b
GROUP BY b.AID
ORDER BY b.BID DESC
LIMIT 5Die Abfrage gruppiert mir alles schön, aber ordnet nicht nach dem aktuellsten Eintrag, sondern kreuz und quer :)
das problem liegt zum einen an deinen aggregat-funktionen. die MAX(b.BID) funktion und die MAX(DATE_FORMAT(b.datum,'%d.%m')) funktion sind unabhängig voneinander, sprich er nimmt die größte b.BID und den größten datumswert einer gruppierung, egal ob diese beiden werte in einem datensatz stehen oder in unterschiedlichen. und da du nach der b.BID sortierst, hat die sortierung schon mal gar nichts mit dem datum zu tun.
Ilja
Hi Iljaa,
ich habe fast damit gerechnet von dir zu hören :)
SELECT MAX(b.BID),DATE_FORMAT(b.datum,'%d.%m') AS zeit
FROM bewertung AS b
GROUP BY b.AID
ORDER BY b.BID DESC
LIMIT 5
Die höchste BID muss gleichzeitig immer das aktuellste Datum sein bzw. die höchste BID ist der letzte Eintrag :)
Ich habe oben mal auf MAX() beim Datum verzichtet, aber da kommt genauso ein durcheinander raus wie vorher.
Ich verstehe einfach nicht wieso das nicht klappt, er soll ja nur den letzten Eintrag holen (also den mit der höchsten BID und damit auch das aktuellste Datum) der einem Anbieter zugeordnet ist.
Das z.B. klappt (von der Sortierung her):
SELECT b.BID,DATE_FORMAT(b.datum,'%d.%m') AS zeit
FROM bewertung AS b
ORDER BY b.BID DESC
LIMIT 5
Nur habe ich dann hier unter Umständen mehrmals den gleichen Anbieter hintereinander unter den 5 ergebnissen.
Viele Grüße, Chrisi ...
yo,
Die höchste BID muss gleichzeitig immer das aktuellste Datum sein bzw. die höchste BID ist der letzte Eintrag :)
nein, dass muss nicht zwangsweise so sein. du hast darauf keine garantie und ist eine kleine stolperfalle. selbst wenn du die BID mit autoincrement hochzählst, würde ich versuchen, das anders zu implemenieren. es ist einfach sauberer. der letzte eintrag wird alleine dadurch gekennzeichnet, indem du das MAX(datum) ausliest. dieses datum kann dann wiederum benutzt werden, um den rest des datensatzes zu bekommen, bzw. aller datensätze, die dem datum entsprechen.
Ich habe oben mal auf MAX() beim Datum verzichtet, aber da kommt genauso ein durcheinander raus wie vorher.
ist ja auch kein wunder, dass die sortierung nicht geht. zum ersten ist MAX(b.BID) überflüssig, da du nach dieser spalte gruppierst, es gibt quasi immer nur einen wert. bei datum gibt es aber mehrere und hier ist dann auch der haken, der alles durcheinander bringt, weil du dort keine aggregat-funktion benutzt und auch nicht danach gruppierst. das ist böse. ;-)
sag doch noch mal, welche mysql version du benutzt und wie deine tabellen aussehen. kannst auch mal folgende query versuchen, allerdings mit dem hinweis, dass dies nicht sauber implementiert ist, wegen oben genannten gründen.
SELECT b.AID, MAX(b.BID), MAX(DATE_FORMAT(b.datum,'%d.%m')) AS zeit
FROM bewertung AS b
GROUP BY b.AID
ORDER BY zeit DESC
LIMIT 5
Ilja
yo,
muss mich sebst korregieren, bin ein wenig durcheinander gekommen.
ist ja auch kein wunder, dass die sortierung nicht geht. zum ersten ist MAX(b.BID) überflüssig, da du nach dieser spalte gruppierst, es gibt quasi immer nur einen wert.
du gruppierst ja nach einen anderen wert, also den satz streichen... ;-)
Ilja
Hi Ilja,
dein Query hat nicht geklappt, es scheint an der ORDER BY zu liegen, der kommt wohl nicht mit der Sortierung des Datums klar weil ja nur "d-m" ...
Ich habe aber deine Änderung bemerkt und folgendes gemacht:
SELECT b.AID, MAX(b.BID), MAX(b.datum) datum, MAX(DATE_FORMAT(b.datum,'%d.%m')) AS zeit
FROM bewertung AS b
GROUP BY b.AID
ORDER BY datum DESC
LIMIT 5
Ich schätze mal ich verstosse gegen alle Regeln der Kunst, aber es klappt :)
Meine MySQL Version: 4.0.15-Max.
Meine Tabellen schaun so aus:
BID | AID | punkte | datum
--------------------------
1 | 22 | 4 | 20050503130732
2 | 55 | 5 | 20050504130732
3 | 55 | 3 | 20050504132020
4 | 99 | 2 | 20050506132020
5 | 2 | 4 | 20050504132020
6 | 2 | 4 | 20050504133020
BID = autoincrement
In meiner beispiel Tabelle haben 2 Anbieter (55,2) kurz hintereinander eine Bewertung erhalten.
Viele Grüße, Chrisi
yo,
dein Query hat nicht geklappt, es scheint an der ORDER BY zu liegen, der kommt wohl nicht mit der Sortierung des Datums klar weil ja nur "d-m" ...
nein, ORDER BY macht keine probleme, wobei ich anmerken muss, dass ich mir die formatierung des datums nicht genau angeschaut habe.
Ich schätze mal ich verstosse gegen alle Regeln der Kunst, aber es klappt :)
nun ja, du solltest es zumindetstens im hinterkopf haben, dass es nicht sauber implementiert ist. ich hatte gehofft, deine version kann schon unterabfragen, abre diese sind erst ab 4.1 und höher dabei. notfalls geht es auch über zwei abfragen.
wie auch immer, hauptsache der "kunde" ist zufrieden...
Ilja
Hi Ilja,
ich hatte gehofft, deine version kann schon unterabfragen, abre diese sind erst ab 4.1 und höher dabei. notfalls geht es auch über zwei abfragen.
Danke wiedermal für Deine Hilfe, ich werde mir das Thema Unterabfragen mal genauer anschauen, sowas kann ich sicher an einigen Stellen in anderen Abfragen gut gebrauchen.
Bei Bedarf werde ich mich bemühen eine aktuele MySQL Version zu bekommen :)
Viele Grüße, Chrisi ...