无法选择多部件(多仓库)订单

时间:2017-12-02 12:58:19

标签: mysql sql database database-design relational-database

我试图让订单分成几部分。 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项目?

1 个答案:

答案 0 :(得分: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

这假定每个订单商品与订单部件表中的仓库匹配。

订单也会准备好您的结果以供日后格式化。