选择多部分(多仓库)订单时遇到问题

Trouble Selecting Multipart (Multi Warehouse) Orders

我正在尝试将订单分成几部分。 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 是我遇到的麻烦。我需要这个 table,因为在这里,我指出是否已发货来自该特定仓库的订单。


这是我想要实现的结构:

我知道这需要用 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'

这里是link到SQL Fiddle Example


对于我想要实现的目标来说,这是一个很好的 table 设计吗?我如何 SELECT 正确地 SELECT 项目,如上图所示?

您只需要重新排列联接并在仓库 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

这假设每个订单项目都与订单部件中的一个仓库相匹配 table。

order by 还为以后的格式化准备结果。