Ole: Probleme mit SQL-Query

Hallo,

ich habe einen kleinen Knoten im Hirn und hoffe, dass ihr mir helfen könnt den zu lösen.

Aus unserem xtCommerce Webshop sollen Daten aus der Datenbank in SAP B1 übergeben werden. Im Prinzip auch kein Problem, nur an einer Stelle hapert es grade etwas.

In der mySQL-Datenbank (v4) gibt es für Bestellungen von Artikeln mit Varianten die Tabelle "orders_products_attributes" in welcher zu jedem bestellten Artikel die Varianten hinterlegt werden.

Nun gibt es Artikel bei uns, bei denen dort 4 Zeilen eingetragen werden. Die Datenfelder sind:

orders_products_attributes_id (auto increment, primärschlüssel)
orders_id (bezieht sich auf die Bestellung)
orders_products_id (bezieht sich auf einen Artikel einer Bestellung)
products_options (Name der Variante)
products_options_values (Wert der Variante)
options_values_price (Preis der Variante)
price_prefix (Vorzeichen für options_values_price bezogen auf den Basispreis)
products_attributes_model (Artikelnummer der Variante)

Nun suche ich nach einer Möglichkeit eine SQL-Query zu formulieren, die mir für jeden Artikel nur eine Zeile mit den relevanten Daten zurückliefert.

Dreh- und Angelpunkt dürfte "orders_products_id" sein.

Von den 4 zurückgelieferten Datensätzen, brauche ich aus dem ersten "products_attributes_model", "products_options" und "products_options_values". Von den Zeilen 2-4 jeweils nur "products_options" und "products_options_values" und von Zeile 2 zusätzlich noch "options_values_price"

Der zurückgelieferte Datensatz sähe idealerweise etwa so aus:

"orders_id", "orders_products_id", "products_attributes_model", "products_options_1", "products_options_values_1", "options_values_price_1", "products_options_2", "products_options_values_2", "options_values_price_2","products_options_3", "products_options_values_3","products_options_4", "products_options_values_4"

Ist das mit SQL machbar? wenn ja, wie?

Danke
Ole
(8-)>

--
Das Wort Vegetarier kommt aus dem Indianischen und bedeutet: Zu dumm zum Jagen.
  1. yo,

    zwischen 4.0 und 4.1 gibt es "gewaltige" unterschiede, welche server version benutzt ihr den ?

    Ilja

    1. Hi

      zwischen 4.0 und 4.1 gibt es "gewaltige" unterschiede, welche server version benutzt ihr den ?

      Wenn ich das richtig sehe Version 4.1.22

      Gruß
      Ole
      (8-)>

      --
      Das Wort Vegetarier kommt aus dem Indianischen und bedeutet: Zu dumm zum Jagen.
      1. yo,

        Wenn ich das richtig sehe Version 4.1.22

        war viel auf arbeit zu tun, bin noch nicht zu einer antwort gekommen, aber 4.1 hört sich gut an. kannst du mir noch beispiele geben, mit den vier datensätze, wie sie dann in einem datensatz aufgelöst werden sollen ? dann sollte die abfrage kein problem sein.

        Ilja

        1. Hallo Ilja,

          war viel auf arbeit zu tun, bin noch nicht zu einer antwort gekommen, aber 4.1 hört sich gut an. kannst du mir noch beispiele geben, mit den vier datensätze, wie sie dann in einem datensatz aufgelöst werden sollen ? dann sollte die abfrage kein problem sein.

          Vielen Dank schon mal für deine Mühen.

          Hier mal die Datensätze:

          orders_products_attributes_id, orders_id, orders_products_id, products_options, products_options_values, options_values_price, price_prefix,  products_attributes_model
          6, 3, 7, Griffstärke, SL, 0, +, 0060000004200006
          7, 3, 7, Besaiten, Ja, 6,7226, +, 9999999999999999
          8, 3, 7, Härte (quer), 22kg, 0, +, 0,
          9, 3, 7, Härte (längs), 27kg, 0, +, 0,

          Mein Traumdatensatz würde jetzt so aussehen:

          3, 7, 0060000004200006, Griffstärke, SL, 0, +, Besaiten, Ja, 6,7226, +, Härte (quer), 22kg, Härte (längs), 27kg

          Danke & Gruß
          Ole
          (8-)>

          --
          Das Wort Vegetarier kommt aus dem Indianischen und bedeutet: Zu dumm zum Jagen.
          1. Hello,

            Mein Traumdatensatz würde jetzt so aussehen:
            3, 7, 0060000004200006, Griffstärke, SL, 0, +, Besaiten, Ja, 6,7226, +, Härte (quer), 22kg, Härte (längs), 27kg

            immer? Also, wenn ich deine Datensätze mal d1 bis d4 nenne und die Spalten mal  s1 bis s8, ist dann dein Traumdatensatz IMMER
            d1.s2, d1.s3, d1.s8, d1.s4, d1.s5, d1.s6, d1.s7, d2.s4, d2.s5, d2.s6, d2.s7, d3.s4, d3.s5, d4.s4, d4.s5

            Wenn nein: vergiss es, die Logik, die hinter dem Datensatz steckt, ist zu verworren und nur für das menschliche Auge lösbar.
            Wenn ja (oder es zumindest ein generell gültiges Kriterium gibt): vielleicht(!) gibt es eine Lösung, allerdings nur, wenn die Anzahl der beteiligten Attribute feststeht, ebenso wie ihre Reihenfolge und vor allem warum manchmal eine Spalte übernommen wird und manchmal nicht. Aber alles in allem: mein Bauch sagt, dass du mit SQL keine befriedigende Lösung dafür finden wirst.

            MfG
            Rouven

            --
            -------------------
            sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
            He is entertaining both out of the car and in the car because if you tell him that a corner is almost flat then he is the guy who is going to try to take it flat even if it means shunting it the other side of it, he will come with the data and say 'hey, I may have crashed and destroyed the car, but I was flat-out'. That is an interesting quality that he has!  --  Team Member on Jacques Villeneuve
            1. Hallo Rouven,

              immer?

              Ja

              Also, wenn ich deine Datensätze mal d1 bis d4 nenne und die Spalten mal  s1 bis s8, ist dann dein Traumdatensatz IMMER
              d1.s2, d1.s3, d1.s8, d1.s4, d1.s5, d1.s6, d1.s7, d2.s4, d2.s5, d2.s6, d2.s7, d3.s4, d3.s5, d4.s4, d4.s5

              Genau

              Wenn ja (oder es zumindest ein generell gültiges Kriterium gibt): vielleicht(!) gibt es eine Lösung, allerdings nur, wenn die Anzahl der beteiligten Attribute feststeht, ebenso wie ihre Reihenfolge und vor allem warum manchmal eine Spalte übernommen wird und manchmal nicht. Aber alles in allem: mein Bauch sagt, dass du mit SQL keine befriedigende Lösung dafür finden wirst.

              Die Datensätze sehen immer genau so aus. Gleiche Reihenfolge, nur unterschiedliche Werte für einige Felder.

              Danke & Gruß
              Ole
              (8-)>

              --
              Das Wort Vegetarier kommt aus dem Indianischen und bedeutet: Zu dumm zum Jagen.
              1. yo,

                Die Datensätze sehen immer genau so aus. Gleiche Reihenfolge, nur unterschiedliche Werte für einige Felder.

                dann ist es auch lösbar, eine frage habe ich allerdings noch, woran erkennt man, dass es sich um d1, d2, d3 oder d4 handelt, gibt es ein kriterium, nachdem man es unterscheiden kann, zum beispiel bestimmte spaltenwerte, ein datum oder zur not auch die pk reihenfolge ?

                Ilja

                1. Hallo

                  dann ist es auch lösbar, eine frage habe ich allerdings noch, woran erkennt man, dass es sich um d1, d2, d3 oder d4 handelt, gibt es ein kriterium, nachdem man es unterscheiden kann, zum beispiel bestimmte spaltenwerte, ein datum oder zur not auch die pk reihenfolge ?

                  Das Feld "products_options" enthält immer die gleichen vier Werte "Griffsträke", "Besaiten", "Härte (längs)" oder "Härte (quer)". Die zusammengehörigkeit der 4 Datensätze ergibt sich über den Wert von "orders_products_id".

                  Danke & Gruß
                  Ole
                  (8-)>

                  --
                  Das Wort Vegetarier kommt aus dem Indianischen und bedeutet: Zu dumm zum Jagen.
                  1. yo,

                    ich kann ja mal einen lösungsweg andeuten, vielleicht reicht dir das ja schon. wenn nicht kann ich dir auch die komplette abfrage erstellen.

                    1. Nimm alle datensätze mit den wert griffstärke (WHERE klausel), dann hast du schon mal die richtige anzahl an datensätze 1/4.

                    2. du gibts die spalten für den datensatz mit den griffstärken an (SELECT)

                    3. du bindest die anderen spalten mit dem jeweiligen wert in der products_options spalte mit unterabfragen ein, wobei die unterabfrage korreliert mit der orders_products_id spalte

                    ...fertig

                    Ilja

                    1. Hallo Ilja,

                      ich habe nun ein paar Stunden versucht zu verstehen, was du mir da aufgeschrieben hast...Google bemüht, Bücher gewälzt...leider ohne Erfolg :(

                      1. würde ich so verstehen:
                      SELECT FROM table where products_options = "griffstärke"

                      Für den Rest reicht mein Verständniss für SQL scheinbar nicht aus :(

                      Danke & Gruß
                      Ole
                      (8-)>

                      --
                      Das Wort Vegetarier kommt aus dem Indianischen und bedeutet: Zu dumm zum Jagen.
                      1. Hello,

                        Für den Rest reicht mein Verständniss für SQL scheinbar nicht aus :(

                        helfen vielleicht die Beispiele für korrelierte Unterabfragen im MySQL-Handbuch?

                        MfG
                        Rouven

                        --
                        -------------------
                        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
                        Buy when there's blood running in the street and sell when everyone is pounding at your door, clawing to own your equities  --  Wisdom on Wallstreet
                        1. Nabend,

                          helfen vielleicht die Beispiele für korrelierte Unterabfragen im MySQL-Handbuch?

                          Über die bin ich auch schon gestolpert. Werde noch mal eine Nacht darüber schlafen um dann zu sehen, ob ich es dann verstehe.

                          Danke & Gruß
                          Ole
                          (8-)>

                          --
                          Das Wort Vegetarier kommt aus dem Indianischen und bedeutet: Zu dumm zum Jagen.
                          1. yo,

                            hier mal ein beispiel, die beiden unterabfragen kannst du für die beiden anderen fälle erweitern.

                            SELECT t1.orders_id, t1.orders_products_id, t1.products_attributes_model,
                                   t1.products_options, t1.products_options_values,
                                   t1.options_values_price, t1.price_prefix,
                                   (SELECT t2.products_options
                                    FROM tabelle t2
                                    WHERE t2.products_options = 'Besaiten'
                                    AND t2.order_id = t1.order_id
                                   ),
                                   (SELECT t2.products_options_values
                                    FROM tabelle t2
                                    WHERE t2.products_options = 'Besaiten'
                                    AND t2.order_id = t1.order_id
                                   )
                            FROM tabelle t1
                            WHERE t1.products_options = 'Griffstärke'
                            ;

                            Ilja

                            1. Guten Morgen,

                              SELECT t1.orders_id, t1.orders_products_id, t1.products_attributes_model,
                                     t1.products_options, t1.products_options_values,
                                     t1.options_values_price, t1.price_prefix,
                                     (SELECT t2.products_options
                                      FROM tabelle t2
                                      WHERE t2.products_options = 'Besaiten'
                                      AND t2.order_id = t1.order_id
                                     ),
                                     (SELECT t2.products_options_values
                                      FROM tabelle t2
                                      WHERE t2.products_options = 'Besaiten'
                                      AND t2.order_id = t1.order_id
                                     )
                              FROM tabelle t1
                              WHERE t1.products_options = 'Griffstärke'
                              ;

                              Großartig :) ...ich glaube ich verstehe es jetzt. Ich werde das mal weiter austüfteln :)

                              Vielen, vielen Dank :)

                              Gruß
                              Ole
                              (8-)>

                              --
                              Das Wort Vegetarier kommt aus dem Indianischen und bedeutet: Zu dumm zum Jagen.