jmeister: mySQL tabellen kreuzen

Hi, irgendwie stehe ich auf dem schlauch, ich habe zwei tabellen, eine enthält verschiedene Dateien mit versionen und builddatum, die andere enthält quasi die build historie.

dateiliste:

id|dateiname|... 1 |datei 1|... 2 |datei 2|... 3 |datei 3 |... ...|...|...

build_history:

id|datei_id|buildatum|Versionsnummer 1 |1 |2016-05-01|... 2 |2 |2016-05-01|... 3 |3 |2016-05-01|... 4 |1 |2016-05-02|... 5 |1 |2016-05-03|... 6 |2 |2016-05-04|... ...|...|...|...

(build_history.datei_id ist ein bezug auf dateiliste.id(unique a.i.)

ich möchte nun diese beiden Tabellen so verknüpfen das folgendes dabei rauskommt

Dateiübersicht

dateiname|vorvorletztes builddatum |vorletztes builddatum| aktuelles builddatum datei 1| 2016-05-01| 2016-05-02| 2016-05-03 datei 2|- |2016-05-01|2016-05-04 datei 3|- | -|2016-05-01 ...|...|...|...

Ich könnte das jetzt in php so lösen, dass ich mir über while eine Tabelle ausgeben lasse, und in jeder zeile mit der gegebenen id eine neue sql query absende die die entsprechende Zeile füllt, aber das ist ziemlicher murks denke ich.

ich komm nicht drauf wie ich es machen soll indem ich nur eine elegante mysql query nutze

Nils

  1. Tach!

    Ich könnte das jetzt in php so lösen, dass ich mir über while eine Tabelle ausgeben lasse, und in jeder zeile mit der gegebenen id eine neue sql query absende die die entsprechende Zeile füllt, aber das ist ziemlicher murks denke ich.

    Ja, das kann man gleich im DBMS erledigen lassen und spart sich eine Menge Statements.

    ich komm nicht drauf wie ich es machen soll indem ich nur eine elegante mysql query nutze

    Eine, bestehend aus vier Teilen. Formuliere die Query zunächst ohne Build-Daten. Dann formulierst du ein Statement, wie du zu einer Datei-ID an das Datum kommst (dazu gleich mehr). Dir geht es doch nur um das Datum und eventuelle andere Daten aus der Tabelle interessieren dich nicht, oder? Wenn das der Fall ist, setze dann die drei Querys als Correlated Subquery in die Haupt-Query ein.

    Die Query nach dem Datum kannst du nach Datum absteigend sortieren lassen und nimmst mit LIMIT den ersten Datensatz. Die Query nimmst du noch zweimal und setzt da das Limit so, dass es den zweiten beziehungsweise den dritten Datensatz nimmt.

    dedlfix.

    1. SELECT dateiname, (select builddatum from build_history where build_history.datei_id = dateiliste.id limit 1) FROM `dateiliste` 
      
      

      das klappt schon mal.

      SUPI! Jetzt probier ich erstmal rum wie ich das vorletzte und vorvorletzte Ergebnis bekomme

      LG Nils

      1. Tach!

        Jetzt probier ich erstmal rum wie ich das vorletzte und vorvorletzte Ergebnis bekomme

        Genauso einfach, man kann dem Limit auch noch eine Startposition mitgeben.

        dedlfix.

      2. SELECT dateiname, (select builddatum from build_history where build_history.datei_id = dateiliste.id limit 1) FROM `dateiliste`
        

        das klappt schon mal.

        SUPI! Jetzt probier ich erstmal rum wie ich das vorletzte und vorvorletzte Ergebnis bekomme

        LG Nils

        und mit offset geht auch das! tausend dank, und da ich selber drauf kommen musste durch deinen Schubser in die richtige Ricthung hab ich auch was gelernt :-)

        gruß Nils