Probleme mit SQL-Query
Ole
- datenbank
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-)>
yo,
zwischen 4.0 und 4.1 gibt es "gewaltige" unterschiede, welche server version benutzt ihr den ?
Ilja
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-)>
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
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-)>
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
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-)>
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
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-)>
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
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-)>
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
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-)>
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
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-)>