2017-12-02 1 views
0

Ich versuche, die Bestellung in Teile aufgeteilt werden. 1, 3, 20. Ist egal. Und jedes Teil bedeutet, dass es diese Produkte aus einem anderen Lager nimmt.Probleme bei der Auswahl von Multipart (Multi Warehouse) Bestellungen

Ich habe dies versucht:

CREATE TABLE w_orders (
    order_id int, 
    customer_id int, 

    PRIMARY KEY(order_id) 
); 
CREATE TABLE w_order_items (
    order_item_id int, 
    order_id int, 
    warehouse_id int, 
    product_id int, 
    quantity int, 
    base_price int, 

    PRIMARY KEY(order_item_id) 
); 
CREATE TABLE w_order_parts (
    order_part_id int, 
    order_id int, 
    part int, 
    warehouse_id int, 
    shipped int, 

    PRIMARY KEY(order_part_id) 
); 

w_orders ist, wo die eindeutige Bestell-ID zugeordnet ist, und in dem der Client zugewiesen ist.

w_order_items sind alle Produkte in der Bestellung, aus mehreren Lagern.

Und w_order_parts ist, was ich habe Probleme mit. Ich brauche diesen Tisch, denn hier gebe ich an, ob die Bestellung aus diesem Lager verschickt wurde.


Dies ist die Struktur I zu erreichen versuchen:Image Preview

Ich verstehe, dass dies mit PHP verarbeitet werden muss wie folgt aussehen. Ich frage nicht danach. Ich habe mich nur an das Design der Datenbank und die Auswahl der Datenbank gehalten.

Wenn ich versuche abzufragen bekomme ich mehrere gleiche w_order_items.

SELECT 

    w_orders.order_id, 
    w_orders.customer_id, 

    w_order_items.order_item_id, 
    w_order_items.order_id, 
    w_order_items.warehouse_id, 
    w_order_items.product_id, 
    w_order_items.quantity, 
    w_order_items.base_price, 

    w_order_parts.order_part_id, 
    w_order_parts.order_id, 
    w_order_parts.part, 
    w_order_parts.warehouse_id, 
    w_order_parts.shipped 

FROM 
    w_orders 

LEFT JOIN w_order_items 
    ON w_orders.order_id = w_order_items.order_id 

LEFT JOIN w_order_parts 
    ON w_orders.order_id = w_order_parts.order_id 


WHERE w_orders.order_id = '100' 

Heres ein Link zu SQL Fiddle Example


Ist das ein guter Tabellenentwurf für das, was ich zu erreichen versuchen und wie SELECT ich die Einzelteile wie richtig im Bild oben?

+0

Die exakte Ausgabe, die Sie erzielen möchten, wird normalerweise am besten in der Präsentationsebene (z. B. PHP) gehandhabt. Wie benutzt du MySQL? –

+0

@TimBiegeleisen Ja, das weiß ich. Ich bin nicht dort angekommen, weil ich mit dem Design und der Auswahl von MySQL festgefahren bin. Das Bild oben dient nur dazu, visuelle Hilfe zu geben, wie es funktionieren wird, wenn es fertig ist. – Borsn

Antwort

2

Sie müssen nur die Verknüpfungen neu zu ordnen und umfassen eine auf dem Lager-ID verbinden ...

http://sqlfiddle.com/#!9/27bf7/3

SELECT 

    w_orders.order_id, 
    w_orders.customer_id, 

    w_order_items.order_item_id, 
    w_order_items.order_id, 
    w_order_items.warehouse_id, 
    w_order_items.product_id, 
    w_order_items.quantity, 
    w_order_items.base_price 

FROM 
    w_orders 

LEFT JOIN w_order_parts 
    ON w_order_parts.order_id = w_orders.order_id 

LEFT JOIN w_order_items 
    ON w_order_items.order_id  = w_order_parts.order_id 
    AND w_order_items.warehouse_id = w_order_parts.warehouse_id 


WHERE 
    w_orders.order_id = '9898' 

ORDER BY 
    w_orders.customer_id, 
    w_orders.order_id, 
    w_order_parts.warehouse_id, 
    w_order_items.order_item_id 

Dies setzt voraus, dass jede Auftragsposition ein Lager in der Reihenfolge Teiltabelle übereinstimmt.

Die Bestellung von bereitet auch Ihre Ergebnisse für die spätere Formatierung.

+0

Ja, das funktioniert so, wie ich es wollte. Vielen Dank! Denken Sie, dass dies ein effizientes Datenbankdesign ist? Es ist wichtig, dass ich 'w_order_parts.order_part_id' auf den Versand oder andere Status nach Bedarf aktualisieren kann. – Borsn

+0

Idealerweise denke ich, dass die Bestellartikel eine 'order_part_id' haben sollten, um Beziehungen klarer zu machen. * (Eine Bestellung besteht aus Teilen, die aus Artikeln bestehen) *. Aber ansonsten ist es in Ordnung. – MatBailie

+0

Wird das schwieriger zu wählen? Ich müsste Teile mit der order_id auswählen und dann die mit diesem Teil verknüpften Produkte auswählen. – Borsn