MySQL
-
Sorry, hatte das am Anfang wohl falsch gelesen.
Wenn du zu jeder Projekt-ID das max(datum) haben willst kommst du imho in mysql momentan nicht um einen extra-select zum auslesen jeder id mit dem entsprechenden maxdatum herum.
Ich finde das verhalten von mysql nur ziemlich komisch. Sollte es nicht eigentlich abbrechen wenn ein Feld weder von einer Aggregatfunktion umschlossen noch im group-by steht? Dann einfach irgendwas zurückzugeben finde ich ziemlich sch... von mysqlUnd natürlich gibt limit 0,1 immer nur einen Datensatz zurück
-
Ja eigentlich sollte es der SQL-Interpreter anmeckern, aber auch dann würden nicht die richtigen Daten geliefert werden. Ich vermute mal, dass mysql automatisch die Felder ohne Aggregatfuntion in die Liste des GROUP BY mitaufnimmt.
-
Das kann ja nicht sein. Dann würde man mehr ergebniszeilen zurückbekommen, da ja nach mehr bedingungen gruppiert wird.
aber (scheinbar) wahrlos einen Wert anzuzeigen find ich sehr gefährlich
-
Natürlich kann man das ganze auch in MySQL mit einer SQL-Query lösen. Man muss nur ein bißchen tricksen:
Nehmen wir an, die Tabellen sind definiert wie folgt:
CREATE TABLE projekte ( id INT(11) AUTO_INCREMENT, name VARCHAR(50), PRIMARY KEY(id) ); CREATE TABLE history ( pid INT(11) NOT NULL, aktion VARCHAR(50), zeit TIMESTAMP );
Dann liefert folgende Query
SELECT p.id,p.name,h1.aktion,h1.zeit FROM projekte p INNER JOIN history h1 ON p.id=h1.pid LEFT JOIN history h2 ON h1.zeit<h2.zeit AND h1.pid=h2.pid WHERE h2.zeit IS NULL ORDER BY p.name;
einwandfrei die letzten Aktionen zusammen mit den jeweiligen Daten des Projektes. Durch den Self-Join ist das ganze intern zwar relativ aufwendig, bei richtigen Indizees, sollte sich das ganze aber noch im Rahmen des erlaubten bewegen.
Gruß Jens
-
Cool - danke!
Wie ich sehe kann man ja doch richtig viel bzw. fast alles mit SQL direkt machen - man muss nur wissen wie