2017-12-02 5 views
0

注文を部品に分割しようとしています。 1、3、20は関係ありません。 それぞれの部分は、それらの製品を別の倉庫から取っていることを意味します。問題マルチパート(複数倉庫)オーダーの選択

私はこれを試してみました:

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は、固有の注文IDが割り当てられているところであり、クライアントがどこに割り当てられています。

w_order_itemsは、複数の倉庫から順番にすべての製品です。

そしてw_order_partsは私が問題を抱えています。私はこのテーブルが必要です。なぜなら、この特定の倉庫からの注文が出荷されたことを示しているからです。


これは私が達成しようとしている構造である:Image Preview

私は、これはこのように見えるようにPHPで処理する必要があることを理解しています。私はここでそれについて尋ねていません。ちょうどデータベースの設計とそれを選択して立ち往生してください。

私が照会しようとすると、私は同じものの倍数を得るでしょう。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' 

相続人SQL Fiddle Example


へのリンクは、これは私が達成しようとしています何のために良いテーブル設計であり、私は上の画像のように適切にアイテムをSELECTんか?

+0

達成したい正確な出力は、通常、プレゼンテーションレイヤー(PHPなど)で最もよく処理されます。どのようにMySQLを使用していますか? –

+0

@TimBiegeleisenうん、私はそれを知っている。私はMySQLの設計と選択に悩まされていたので、そこにはいませんでした。上記の画像は、終了時にどのように機能するかを視覚的に補助するためのものです。 – Borsn

答えて

2

はあなただけ...加わり再配置する必要があり、倉庫IDに参加含ま

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 

これは、すべての注文商品が注文部品表に倉庫と一致していることを前提としてい

注文は、後で書式設定するための結果も準備します。

+0

これは私の望むように機能します。ありがとう!これは効率的なデータベース設計だと思いますか?必要に応じて 'w_order_parts.order_part_id'を出荷状態に更新することが重要です。 – Borsn

+0

理想的には、オーダーアイテムには、関係をより明確にするための 'order_part_id'が必要です。 *(注文は、アイテムから構成されている部品から構成されています)*。しかし、それ以外は大丈夫です。 – MatBailie

+0

選択しにくいことはありませんか? order_idで部品を選択し、その部品にリンクされている製品を選択する必要があります。 – Borsn

関連する問題