2011-03-24 19 views
1

我有一个表像这样:MySQL的 - 使用find分钟的价格加盟

ORDER_ID INT 的product_id INT average_price DOUBLE other_price DOUBLE

有多种product_idsorder_id即多种产品的每个订单。我想以最低的平均价格每个订单的产品和这些产品那些other_price >= average_price

我已经试过这样:

SELECT a.order_id, a.product_id, a.average_price, a.other_price 
FROM 
    (SELECT order_id, product_id, min(average_price) as average_price 
    FROM orders 
    GROUP BY order_id 
    ) as min_priced_product_per_order 
JOIN orders AS a ON a.order_id = min_priced_product_per_order.order_id and min_priced_product_per_order.product_id = min_priced_product_per_order.product_id 
WHERE a.other_price >= a.average_price 

但结果不出我所料,我不相信,我收到product_id与最低平均价格为每个订单(我已经证实检查数据库)。

你能提出一个更好的查询吗?

干杯。

皮特

回答

1

关键是你的问题是,PRODUCT_ID只是坐在没有松动的分组也不是聚合函数(这个查询将不会在大多数关系数据库管理系统的飞行)。

(SELECT order_id, product_id, min(average_price) as average_price 
    FROM orders 
    GROUP BY order_id 
) as min_priced_product_per_order 

这是一个很棒的扩展MySQL,用于避免某些需要过去不支持的子查询的连接。 product_id被任意选择,即无论它是否首先找到没有特别原因的行。如果您正在查找某个product_id,肯定不会(如果不小心)返回您想要的结果。 http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html

通过在内部查询中删除聚集中的违规id(product_id),然后在此情况下加入您的聚合值min(average_price)以查找id 。

(SELECT min_order.order_id, product_id, min_order.average_price 
FROM 
(SELECT order_id, min(average_price) as average_price 
    FROM orders 
    GROUP BY order_id 
) AS min_order 
JOIN orders on 
    min_order.product_id = order.product_id 
    AND min_order.average_price = order.average_price 

注意:如果存在平局,这将返回所有最小average_price product_id。对我而言,这似乎是正确的,否则你只是在另一个产品上随意选择一个产品,这不是SQL应该是关于什么的。但是,您可以通过围绕上述查询包装另一个聚合来再次过滤结果,然后选择最小或最大产品ID,以确保每个订单只能得到一个结果。