MySQL: Komplizierte Auflistung

FrankWST

Erfahrenes Mitglied
Hallo,

ich habe eine Tabelle "Gewicht" mit folgenden Spalten:
Code:
- INT       PersonenId (Referenz auf Person.id)
- INT       Gewicht
- TIMESTAMP Aktualisierungszeit

Wenn eine Person ihr Gewicht ändert, wird ein neuer Datensatz mit dem aktuellen Gewicht und der aktuellen Zeit eingefügt.

Nun möchte ich eine Liste erstellen, in der die aktuellen Gewichte aller Personen geordnet nach Gewicht aufgelistet werden.

Kann mir da einer von Euch einen Tipp geben?

Danke,
Frank
 
Hallo,

ich würds mal mit:
Code:
SELECT PersonenId, Gewicht, MAX(Aktualisierungszeit) FROM Gewicht GROUP BY PersonenId, Gewicht;
versuchen. Das sollte dir zur neusten Aktualisierungszeit eines Gewichtes die Person liefern.
 
Aber dadurch habe ich noch keine Auflistung über alle Personen (und deren aktuellen Gewichte)!?

doch, Result sollte eine Liste aller Personen mit dem jeweils aktuellsten Gewicht und Aktualisierungszeit sein....

probiers einfach mal in PHPMyAdmin oder was auch immer du nutzt aus, bin mir selber nicht ganz sicher obs so geht, wenn nicht zurück ans Reißbrett
 
nope. GROUP BY gewicht.. somit hast du pro Person immer noch alle Gewichte, nicht aber nur das aktuelle

SQL:
SELECT
  g.PersonenId,
  g.Gewicht
FROM Gewicht AS g,
  (SELECT PersonenId, MAX(Aktualisierungszeit) AS neustezeit
  FROM Gewicht 
  GROUP BY PersonenId) AS z
WHERE
  g.PersonenId = z.PersonenId
  AND g.Aktualisierungszeit = z.neustezeit
 
Zuletzt bearbeitet von einem Moderator:
nope. GROUP BY gewicht.. somit hast du pro Person immer noch alle Gewichte, nicht aber nur das aktuelle

ähm, nö? Er nimmt nur das aktuellste Datum Pro UserID, also dürfte bei dem Select auch nur ein Datensatz pro UserID übrig bleiben, oder nimmt er an dieser Stelle dann Person->Gewicht->Max(Aktualisierungszeit)? Also zeigt pro User alle Gewichte an, weil Aktualisierungszeit = Max Aktualisierungszeit?
Wie würde sich das ändern wenn man am Ende nur GROUP BY PersonenId hat und gewicht weg lässt? addiert er die Gewichte?
 
nope.
MySQL nimmt bei GROUP BY automatisch alle Fleder die mit keiner GroupByFunktion (also MAX(), SUM() etc) versehen sind in den GROUP BY

Das heisst, MySQL macht aus
SELECT a, b, MAX(c) FROM t GROUP BY a
das folgende
SELECT a, b, MAX(c) FROM t GROUP BY a, b

Nachtrag:
Meine erste Lösung geht zwar, ist jedoch unnötig komlex. Das Folgende ist besser
SQL:
SELECT *
FROM Gewicht AS g,
WHERE
  g.Aktualisierungszeit = (SELECT MAX(Aktualisierungszeit)
                            FROM Gewicht AS sub
                            WHERE g.PersonenId = sub.PersonenId)
 
Zuletzt bearbeitet von einem Moderator:
Thx,

wieder was gelernt, auch wenns mich irgendwie nervt das man selbst für so einfache Sachen nen SubSelect machen muss. Hät gedacht das geht auch mit nem einfachen Group by, wars wieder nix, weiß schon warum ich das so selten benutze.
 
Das Folgende ist besser
SQL:
SELECT *
FROM Gewicht AS g,
WHERE
  g.Aktualisierungszeit = (SELECT MAX(Aktualisierungszeit)
                            FROM Gewicht AS sub
                            WHERE g.PersonenId = sub.PersonenId)

Das funktioniert perfekt (wenn man noch das Komma hinter dem g weg lässt ;)). Vielen Dank Yaslaw!

Gruß,
Frank
 
Zuletzt bearbeitet von einem Moderator:
Zurück