Ankündigung

Einklappen
Keine Ankündigung bisher.

JOIN Ergebnis in IF benutzen?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Thallius
    hat ein Thema erstellt JOIN Ergebnis in IF benutzen?.

    JOIN Ergebnis in IF benutzen?

    Hi,

    sorry für den dummen Thread Titel aber ich habe einfach keine Idee wie ich mein Problem in einen Satz fassen kann.

    Ich habe eine Tabelle Orders. Diese hat Spalten wie Start, End, Number etc. Nichts besonderes.
    Weiterhin habe ich eine Tabelle Tools, welche Werkzeuge beinhaltet, die zu dem Auftrag gelifert werden müssen.
    Um diese Werkzeuge der Order zuzuordnen habe ich eine X-Table OrderTools mit den Spalten orderid und toolid und zwei weiteren Spalten tool_delivered und tool_returned in welche das jeweilige Versende- bzw RücklieferDatum der Tools vermerkt wird. Die Tool köännen nämlich u.U zu ganz anderen Zeiten gelifert und zurück geschickt werden als der Auftrag lautet. Also z.B. kann das eine Tool schon 3 Tage früher vor Ort eintreffen und erst 2 Tage später wieder verschickt werden. Warum das so ist würde zu weit führen hier zu erklären es ist aber ein unveränderlicher Fakt.

    Ich kann das ja auch alles mit meinen Tabellen zu abbilden. Wo ich jetzt ein Problem habe ist, wenn ich mir eine Orderlist ausgeben lassen möchte in der ser aktuelle Status des Auftrags eingefügt wird. Der Status ist "geplant", wenn das Start-Datum des Auftrags noch nicht erreicht ist. "In Ausführung, wenn das erste Tool verschickt wurde und "Beendet" wenn das letzte Tool zurück geschickt wurde.

    Mein Ansatz das abzubilden ist folgender:

    Code:
    $sql = "SELECT DISTINCT(ge_order.order_id),`order_startdate`,`order_enddate`
               GROUP_CONCAT(ge_tool.tool_number SEPARATOR '<br>') AS `order_tools`,
               IF(order_deleted = 1,'".$orderStatusList['deleted']."',
                   IF(ge_ordertool.ordertool_delivered IS NULL,
                            '".$orderStatusList['planned']."',
                       IF(ge_ordertool.ordertool_returned IS NULL,
                                '".$orderStatusList['executing']."','".$orderStatusList['done']."')))
               AS order_status,
               FROM ge_order 
               LEFT JOIN ge_ordertool 
                    ON (ge_order.order_id=ge_ordertool.ordertool_order)
               LEFT JOIN ge_tool 
                    ON (ge_tool.tool_id=ge_ordertool.ordertool_tool)
               WHERE ge_order.order_enddate > DATE_SUB(CURDATE(), INTERVAL 1 YEAR) $type
               GROUP BY ge_ordertool.ordertool_order
               $sWhere 
               $sOrder 
               $sLimit
               ";
    Nun wird aber immer nur der erste Eintrag des ordertools berücksichtigt. Wenn also das erste Tool bereits zurück geliefert wurde, erhalte ich einen Status "Beendet".
    Wie kann ich das oben gewünschte Verhalten erreichen?

    Ich möchte das gerne mit einem Query erschlagen, da in sWhere und sOrder halt noch viele Filter und Sortierung-Parameter stehen, so dass ich die Tabelle eben nach jeder Spalte (eben auch nach Status) sortieren und filtern kann.

    Wenn ich mehrere query mache, dann muss ich das Soriteren und Filtern alles von Hand machen. Nicht unmöglich aber viel Arbeit.

    Gruß

    Claus

  • Thallius
    antwortet
    Warum kann ich denn bei der Lösung dann nicht nach order_status im WHERE abfragen? Da bekomme ich dann eine Error unknown column order_status?

    Gruß

    Claus

    Einen Kommentar schreiben:


  • Thallius
    antwortet
    @rkr

    Ja das ist meine aktuelle Lösung. Macht die Sache aber nicht gerade Performanter...

    Gruß

    Claus

    Einen Kommentar schreiben:


  • akretschmer
    antwortet
    Zitat von Thallius Beitrag anzeigen

    Mein Ansatz das abzubilden ist folgender:
    Wird in zukünftigen Versionen von MySQL wohl auch einen Syntaxfehler bringen. Egal, Dein Problem. Ich würde hier (mal wieder) mit RANGE-Typen arbeiten. Hätte sogar den Charme, daß ein Tool nicht mehrfach verbucht werden kann.

    Einen Kommentar schreiben:


  • rkr
    antwortet
    Mit einem inner-select?
    PHP-Code:
    SELECT FROM (SELECT FROM tabelle) AS a... 

    Einen Kommentar schreiben:

Lädt...
X