2017-12-02 7 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

I는이처럼 보이도록 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' 

을 Heres 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