Vielen Dank im Voraus, ich kann es einfach nicht verstehen!
Ich habe zwei Tische
Ordered_Item
ID | Artikelname 1 | Pizza 2 | Stromboli
Ordered_Options
Ordered_Item_ID | Optionsnummer | Wert 1 43 Peperoni 1 44 Extra Käse 2 44 Extra Käse
Was ich ausgeben möchte, ist eine MySQL-Abfrage, die etwas in diesem Sinne ist
Ausgabe
ID | Item_Name | Option_1 | Option 2 1 Pizza Pepperoni Extra Käse 2 Stromboli NULL Extra Käse
Ich habe zahlreiche Optionen ausprobiert, die meistens mit Syntaxfehlern enden. Ich habe group_concat ausprobiert, aber das ist nicht wirklich das, wonach ich suche. Ich habe unten ein grobes Beispiel dafür, was ich für einen Anfang halte. Ich muss die Optionen jedes Mal in der gleichen Reihenfolge haben. Und in dem Programm, in dem die Informationen gesammelt werden, gibt es keine Möglichkeit, zuverlässig sicherzustellen, dass dies geschieht. Ist es möglich, sie entsprechend der Optionsnummer verketten zu lassen? Ich weiß auch, dass ich nie mehr als 5 Optionen haben werde, damit eine statische Lösung funktioniert
Select Ordered_Items.ID,
Ordered_Items.Item_Name,
FROM Ordered_Items
JOIN (SELECT Ordered_Options.Value FROM Ordered_Options Where Option_Number = 43) as Option_1
ON Ordered_Options.Ordered_Item_ID = Ordered_Item.ID
JOIN (SELECT Ordered_Options.Value FROM Ordered_Options Where Option_Number = 44) as Option_2
ON Ordered_Options.Ordered_Item_ID = Ordered_Item.ID;
Vielen Dank! Joe
Ich schätze die Hilfe, ich glaube, ich habe eine Lösung gefunden, wenn jemand die Wirksamkeit kommentieren würde, würde ich es schätzen. Im Wesentlichen habe ich getan. Mir ist klar, dass es in seiner Implementierung etwas statisch ist, aber ich tue, was ich brauche (verzeihen Sie falsche Syntax)
SELECT ordered_item.id as `Id`, ordered_item.Item_Name as `ItemName`, Options1.Value Options2.Value FROM ORDERED_ITEMS LEFT JOIN (Ordered_Options as Options1) ON (Options1.Ordered_Item.ID = Ordered_Options.Ordered_Item_ID AND Options1.Option_Number = 43) LEFT JOIN (Ordered_Options as Options2) ON (Options2.Ordered_Item.ID = Ordered_Options.Ordered_Item_ID AND Options2.Option_Number = 44);
quelle
Wenn Sie in Ihrem Ergebnis wirklich mehrere Spalten benötigen und die Anzahl der Optionen begrenzt ist, können Sie sogar Folgendes tun:
select ordered_item.id as `Id`, ordered_item.Item_Name as `ItemName`, if(ordered_options.id=1,Ordered_Options.Value,null) as `Option1`, if(ordered_options.id=2,Ordered_Options.Value,null) as `Option2`, if(ordered_options.id=43,Ordered_Options.Value,null) as `Option43`, if(ordered_options.id=44,Ordered_Options.Value,null) as `Option44`, GROUP_CONCAT(if(ordered_options.id not in (1,2,43,44),Ordered_Options.Value,null)) as `OtherOptions` from ordered_item, ordered_options where ordered_item.id=ordered_options.ordered_item_id group by ordered_item.id
quelle
Wenn Sie wissen, dass Sie eine begrenzte Anzahl von maximalen Optionen haben werden, würde ich dies versuchen (Beispiel für maximal 4 Optionen pro Bestellung):
Die Gruppe nach Bedingung entfernt alle Duplikate, die Sie sonst erhalten würden. Ich habe gerade etwas Ähnliches auf einer Site implementiert, an der ich arbeite, wo ich wusste, dass ich immer 1 oder 2 Übereinstimmungen in meiner untergeordneten Tabelle habe, und ich wollte sicherstellen, dass ich nur 1 Zeile für jedes übergeordnete Element hatte.
quelle
Was Sie wollen, wird als Pivot bezeichnet und wird in MySQL nicht direkt unterstützt. Überprüfen Sie diese Antwort auf die Optionen, die Sie haben:
So schwenken Sie ein MySQL-Entitätsattributwertschema
quelle
So würden Sie Ihre Abfrage für diese Art von Anforderung erstellen.
select ID,Item_Name,max(Flavor) as Flavor,max(Extra_Cheese) as Extra_Cheese from (select i.*, case when o.Option_Number=43 then o.value else null end as Flavor, case when o.Option_Number=44 then o.value else null end as Extra_Cheese from Ordered_Item i,Ordered_Options o) a group by ID,Item_Name;
Grundsätzlich "case out" Sie jede Spalte mit
case when
und wählen dann diemax()
für jede dieser Spalten mitgroup by
für jedes beabsichtigte Element.quelle
Joe Edels Antwort auf sich selbst ist tatsächlich der richtige Ansatz, um das Pivot-Problem zu lösen.
Grundsätzlich besteht die Idee darin, zuerst die Spalten in der Basistabelle und dann eine beliebige Anzahl von Spalten
options.value
aus der gemeinsamen Optionstabelle aufzulisten. Nurleft join
dieselbe Optionstabelle mehrmals, um alle Optionen zu erhalten.Was die Programmiersprache tun muss, ist, diese Abfrage dynamisch gemäß einer Liste von Optionen zu erstellen, die abgefragt werden müssen.
quelle