【问题标题】:MySQL - Find min price using joinMySQL - 使用连接查找最低价格
【发布时间】:2011-07-22 13:04:14
【问题描述】:

我有一张这样的桌子:

order_id INT product_id INT 平均价格双倍 other_price DOUBLE

每个order_id 有多个product_ids,即每个订单有多个产品。我想要每个订单平均价格最低的产品,以及这些产品中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(我已通过检查数据库确认)。

你能推荐一个更好的查询吗?

干杯。

皮特

【问题讨论】:

    标签: mysql join min


    【解决方案1】:

    问题的关键是 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 以确保每个订单只能获得一个结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-15
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多