MySQL



  • http://www.mysqlfreaks.com/statements/27.php
    ...demnach scheint MAX() nicht das zu tun was es soll.
    Welchen Datentyp hat denn deine Datum-Spalte ? (Wobei wenn MAX() mit dem Datentyp nicht umgehen kann dürfte MySQL nen Fehler melden oder ?!)



  • Den Zusammenhang verstehe ich jetzt nicht so gnaz 🙄



  • @flenders
    Kannst du mal deinen SELECT zeigen, die Daten deiner Tabellen und was du als Ergebnis bekommst?



  • id  date        val1       val2  
    1   2003-01-01  valprim1   valprim2 
    1   2004-01-01  valprim3   valprim4 
    1   2004-05-06  valprim10  valprim20 
    2   2003-08-09  sdf        sdfsdf
    

    "SELECT * FROM history GROUP BY id" liefert folgendes:

    id  date        val1       val2  
    1   2003-01-01  valprim1   valprim2 
    2   2003-08-09  sdf        sdfsdf
    

    "SELECT id, MAX( date ) , val1, val2 FROM history GROUP BY id" liefert jetzt zwar das richtige Datum, aber eben nicht die dazugehörigen val1 und val2 Werte, sondern die wie oben 🙄



  • Wie wärs mit:

    SELECT id, max(datum), val1, val2 FROM history GROUP BY id, val1, val2
    

    Nachtrag:
    Gerade ist mir eingefallen, dass das so trotzdem nicht geht. Du hast recht flenders, du musst dir zuerst die id holen und kannst dir dann erst mit dieser die restlichen (korekten) Daten holen.



  • 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 mysql 🙄

    Und 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 🤡


Anmelden zum Antworten