2016-01-20 87 views
6

上的库存管理系统的工作,我们有如下表:自连接只返回一个记录

================================================ 
| orders | order_line_items | product_options | 
|--------|-------------------|-----------------| 
| id  | id    | id    | 
| start | order_id   | name   | 
| end | product_option_id |     | 
|  | quantity   |     | 
|  | price    |     | 
|  | event_start  |     | 
|  | event_end   |     | 
================================================ 

我试图来计算某一特定日期的库存,所以我需要一个自联接将order_line_items上的数量与具有相同product_option_id的order_line_items中的其他记录数量的SUM进行比较,以及事件开始和结束在某个范围内的位置。

所以,对于一个日期2016年1月20日,我有:

SELECT order_line_items.id, order_line_items.product_option_id, order_line_items.order_id FROM order_line_items 
WHERE order_line_items.event_end_date >= '2016-01-20 04:00:00' 
AND order_line_items.event_start_date <= '2016-01-21 04:00:00' 
AND order_line_items.product_option_id IS NOT NULL; 

以上的回报127行

当我尝试做一个自我加入,就像这样:

SELECT 
order_line_items.id, 
order_line_items.product_option_id, 
order_line_items.order_id, 
order_line_items.quantity, 

other_line_items.other_product_option_id, 
other_line_items.other_order_id, 
other_line_items.other_quantity, 
other_line_items.total 

FROM order_line_items 

JOIN (
    SELECT 
     id, 
     product_option_id AS other_product_option_id, 
     order_id AS other_order_id, 
     quantity AS other_quantity, 
     SUM(quantity) total 
    FROM order_line_items 
    WHERE order_line_items.event_end_date >= '2016-01-20 04:00:00' 
    AND order_line_items.event_start_date <= '2016-01-21 04:00:00' 
) other_line_items ON order_line_items.product_option_id = other_line_items.other_product_option_id 

WHERE order_line_items.event_end_date >= '2016-01-20 04:00:00' 
AND order_line_items.event_start_date <= '2016-01-21 04:00:00' 
AND order_line_items.product_option_id IS NOT NULL; 

它只返回1条记录。正如你在这里看到的:()有相同的product_option_id有很多记录,所以这最后一个查询应该返回很多行

+0

一个建议,你需要重命名第二个表,因为系统可能会混淆,并且不需要第二个地方,因为你在子查询中有一个。 –

+0

谢谢 - 删除第二个让我获得更多记录的地方,但现在所有返回的记录都有相同的product_option_id ..奇怪:https:// goo。gl/itL5bF – Laravelian

+0

好吧,在'join'选项中试试这个,'order_id = other_order_id和production_order_id = other_production_order_id' –

回答

2

添加SUM(...)将子查询变成一行。也许,子查询需要有其中之一:(我不知道该架构或应用不够好,说这是有道理的)

GROUP BY (id) 
GROUP BY (product_option_id) 
GROUP BY (order_id) 

(请用更短,更鲜明,别名;由于order_line_itemsother_line_items的长度和相似性,SQL非常难以阅读。)

1

您是否确实想要获得以下内容? :

SELECT product_option_id, sum(quantity) 
FROM order_line_items 
WHERE event_end_date >= '2016-01-20 04:00:00' 
AND event_start_date <= '2016-01-21 04:00:00' 
GROUP BY 1 

我不能告诉你为什么需要一个自我在这里加入

0

很难告诉你想要什么没有样品的结果,但是这会给你的每一个订单的产品选项数量的比较该范围内的总:

SELECT oli.order_id, 
     oli.product_option_id, 
     oli.quantity, 
     po.total_quantity 
    FROM order_line_items oli 
    JOIN (
    SELECT product_option_id, 
      SUM(quantity) total_quantity 
     FROM order_line_items 
    WHERE event_end >= '2016-01-20 04:00:00' 
     AND event_start <= '2016-01-21 04:00:00' 
    GROUP BY product_option_id 
     ) po 
    ON po.product_option_id = oli.product_option_id 
WHERE oli.event_end >= '2016-01-20 04:00:00' 
    AND oli.event_start <= '2016-01-21 04:00:00' 

如果你能有一个顺序的相同product_option的多行,你可能需要调整这个像这样:

SELECT oli.order_id, 
     oli.product_option_id, 
     SUM(oli.quantity) order_quantity, 
     po.total_quantity 
    FROM order_line_items oli 
    JOIN (
     SELECT product_option_id, 
      SUM(quantity) total_quantity 
     FROM order_line_items 
     WHERE event_end >= '2016-01-20 04:00:00' 
     AND event_start <= '2016-01-21 04:00:00' 
    GROUP BY product_option_id 
     ) po 
     ON po.product_option_id = oli.product_option_id 
    WHERE oli.event_end >= '2016-01-20 04:00:00' 
    AND oli.event_start <= '2016-01-21 04:00:00' 
GROUP BY oli.order_id, 
     oli.product_option_id 
0

根据我的理解,您应该将ordersproduct_options加入到order_line_items表中。

您的查询应该看起来像这样,对于特定日期之间的订单上的项目数量。

SELECT product_options.id, production_options.name, SUM(order_line_items.quantity) 
FROM order_line_items 
LEFT JOIN product_options ON production_options.id=order_line_items.product_option_id 
LEFT JOIN orders ON orders.id=order_line_items.order_id 
WHERE orders.start>='SOME DATETIME' AND orders.end<='SOME DATETIME' 
GROUP BY product_options.id 

而且,只是一个评论,product_options应可能只是被命名为products。赢得更短的表名称!

+0

我只是想了解更多关于好的餐桌名称。我会用'订单','项目'和'order_item'。 – fiddlestacks