首页 > 解决方案 > MySQL - 如何仅将具有最小值的行加入一次

问题描述

我试图为每个产品获得最低价值的行。在一个简单的数据库中。我将在下面概述。我研究了很多答案,不幸的是没有任何效果。

我已经尝试了一些方法,比如自连接,它工作正常,除了它返回双倍值的相同值。

SELECT
  products.id,
  products.name,
  prices.price,
  prices.price_init
FROM products
LEFT JOIN prices ON prices.product_id = products.id
JOIN(
  SELECT products.id, min(prices.price) as min_price FROM products
  LEFT JOIN prices ON prices.product_id = products.id
  GROUP BY products.id
) as min_prices
ON
  min_prices.id = products.id
  AND
  min_prices.min_price = prices.price

此查询工作正常,但结果加倍。

链接到 sqlfiddle: http ://sqlfiddle.com/#!9/d106d9a/1

如您所见,我需要以最低价格获取 price_init 字段。

谢谢。

标签: mysqlsql

解决方案


我希望每个产品只有一行——即使有多个最低价格——你可以过滤id而不是过滤price

这看起来像

SELECT p.id, p.name, pr.price, pr.price_init
FROM products p LEFT JOIN
     prices pr
     ON pr.product_id = p.id AND
        pr.id = (SELECT pr2.id
                 FROM prices pr2
                 WHERE pr2.product_id = pr.product_id
                 ORDER BY pr2.price
                 LIMIT 1
                );

是一个 SQL 小提琴。

请注意,在 MySQL 8+ 中,您将改为使用窗口函数:

SELECT p.id, p.name, pr.price, pr.price_init
FROM products p LEFT JOIN
     (SELECT pr.*,
             ROW_NUMBER() OVER (PARTITION BY pr.product_id ORDER BY pr.price) as seqnum
      FROM prices pr
     ) pr
     ON pr.product_id = p.id AND pr.seqnum = 1;

推荐阅读