1

我有一张这样的桌子:

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每个订单的最低平均价格(我已经通过检查数据库确认了)。

你能建议一个更好的查询吗?

干杯。

皮特

4

1 回答 1

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。

(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

注意:如果出现平局,这将返回所有最低平均价格产品 ID。对我来说,这似乎是正确的,否则你只是随意选择一种产品而不是另一种产品,这不是 SQL 应该做的。但是您可以通过在上述查询周围包装另一个聚合来再次过滤结果,然后选择一个最小或最大产品 ID 以确保每个订单只能获得一个结果。

于 2011-03-24T23:41:07.547 回答