MySQL - 使用join查找最低价格

时间:2011-03-24 22:55:51

标签: mysql join min

我有一张这样的表:

order_id INT    product_id INT    average_price DOUBLE    other_price DOUBLE

每个product_ids有多个order_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 个答案:

答案 0 :(得分:0)

问题的关键在于product_id只是松散而没有分组或聚合函数(此查询不会在大多数RDMS中出现)。

(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。 / p>

(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,这不是SQL应该是什么。但是,您可以通过在上述查询周围包装另一个聚合来再次过滤结果,然后选择最小或最大产品ID,以确保每个订单只能获得一个结果。