Py学习  »  DATABASE

mysql-如何只使用一次最小值连接行

John Black • 5 年前 • 1439 次点击  

我试图得到每种产品的最小值行。在一个简单的数据库中。我将在下面概述。我研究了很多答案,但不幸的是什么都没用。

我尝试了一些方法,比如self-join,它工作得很好,除了在返回加倍值的相同值上。

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字段。

谢谢。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/47102
 
1439 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Gordon Linoff
Reply   •   1 楼
Gordon Linoff    5 年前

如果每个产品只有一行,即使有多个最低价格,也可以按 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
                );

Here 是一个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;