2013-06-25 16 views
1

我的目标是获取记录的购买价格为项目接受的采购订单。MySQL的检索多表查询最低值

Purchase_Orders表包含的元数据的顺序,如订单号和它的状态(例如,1表示接受,0为下降)。

Purchase_Ord_Contents表包含内容的记录,这些记录通过外键链接到父采购订单上的共享指数order_number)

例如:我在我的数据库中的两个订单,一个已被接受,而另一个已下降。数据被表示为如下:

========================================= 
      PURCHASE_ORDERS TABLE 
========================================= 
id | order_number | order_status 
----------------------------------------- 
    1   PO_100    0 
    2   PO_101    1 
    3   PO_102    1 

=================================================== 
      PURCHASE_ORD_CONTENTS TABLE 
=================================================== 
id | order_number | purchase_price | sku 
--------------------------------------------------- 
    1  PO_100   1.50   APPLE 
    2  PO_100   1.50   ORANGE 
    3  PO_101   2.00   APPLE 
    4  PO_101   2.00   ORANGE 
    5  PO_102   1.75   BANANA 

查询应返回的行3,4和5中,由于PO_101被接受,而PO_100被拒绝和行5不仅是对于给定的SKU的唯一记录,这是也根据接受的订单。我已经尝试了几种不同的方法,但我似乎总是要么最终离开了那名上接受的采购订单,或检索的最低purchase_price错误order_number部分。

这里是我迄今(不正常)

SELECT a.* 
FROM purchase_ord_contents AS a 
     JOIN (SELECT sku, 
        MIN(purchase_price) AS min_price 
      FROM purchase_ord_contents 
      GROUP BY sku) AS b 
     ON (a.sku = b.sku 
       AND a.purchase_price = b.min_price) 
WHERE a.order_number 
IN (
    SELECT order_number 
    FROM purchase_orders 
    WHERE order_status != 0 
) 

该查询成功地返回从purchase_ord_contents表中的记录,但它忽略了那名在采购订单的最低purchase_price记录0

任何指导order_status将不胜感激,我不是“先进”的SQL查询十分精通,你有可能已经确定。谢谢你的时间,请不要犹豫,问我是否应该提供任何进一步的信息。

+0

我不是你要找的内容清晰。什么是“最低购买价格”要求?你想要任何采购订单上物品的最低价格吗? – Jay

回答

1

这可能是你在找什么:

SELECT sku, purchase_price, order_number 
FROM (
    SELECT MIN(purchase_price) AS purchase_price, sku 
    FROM purchase_ord_contents 
    JOIN purchase_orders USING (order_number) 
    WHERE purchase_orders.order_status = 1 
    GROUP BY sku 
) AS min_sku_price -- this is the lowest sale price for each SKU 
JOIN purchase_ord_contents USING (sku, purchase_price) -- gets all orders having sold a SKU at its lowest price 
JOIN purchase_orders USING (order_number) 
WHERE purchase_orders.order_status = 1 

注意,如果最低的,这将返回多行对于一个给定的SKU这个SKU的价格有几个订单。

+0

这正是我一直在寻找的!我在结尾添加了一个额外的'GROUP BY sku'语句,以确保每个SKU只返回一条记录。接受答复,非常感谢! –

0

如果我理解正确的话,我认为你想这样的:

SELECT po.order_number, poc.sku, min(poc.purchase_price) 
FROM purchase_orders AS po 
JOIN purchase_ord_contents AS poc ON poc.order_number = po.order_number 
WHERE po.order_status != 0 
GROUP by po.order_number, poc.sku 
order by po.order_number, poc.sku 
+0

看起来不错,对我说:http://sqlfiddle.com/#!2/fb8dd/3 – PerfectPixel

+1

我本来应该更加明确;只要order_status!= 0,此查询就会为每个SKU返回多个记录。我的目标是每个SKU返回一行,以便我可以知道此SKU的“最低商定价格”。不过谢谢你的意见! –