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

  • 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
    Pre-Coffee-Posts sind mit Vorsicht zu geniessen!


  • #2
    Mit einem inner-select?
    PHP-Code:
    SELECT FROM (SELECT FROM tabelle) AS a... 
    Standards - Best Practices - AwesomePHP - Guideline für WebApps

    Kommentar


    • #3
      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.
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        @rkr

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

        Gruß

        Claus
        Pre-Coffee-Posts sind mit Vorsicht zu geniessen!

        Kommentar


        • #5
          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
          Pre-Coffee-Posts sind mit Vorsicht zu geniessen!

          Kommentar

          Lädt...
          X