选择多部分(多仓库)订单时遇到问题
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 还为以后的格式化准备结果。
我正在尝试将订单分成几部分。 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 还为以后的格式化准备结果。