【问题标题】:mysql query to get the name of a product with the lowest price [duplicate]mysql查询以获取价格最低的产品名称[重复]
【发布时间】:2022-11-17 02:48:49
【问题描述】:

当我执行以下查询时,会出现任何产品的名称,但不会出现价格最低的产品:

SELECT MIN(Price), ProductName
FROM Products;

我怎么会看到价格最低的产品名称?

提前致谢!

【问题讨论】:

  • SELECT * FROM Products ORDER BY Price LIMIT 1

标签: mysql


【解决方案1】:

SELECT Price, ProductName FROM Products ORDER BY Price ASC LIMIT 1

或者

SELECT Price, ProductName FROM Products WHERE Price = (SELECT MIN(Price) FROM Products

或者

SELECT Price, ProductName FROM Products S inner join (select min(Price) from Products) mn on S.Price = mn.Price

【讨论】:

    【解决方案2】:

    SELECT 'productName' FROM Products ORDER BY Price LIMIT 1

    感谢@akina

    【讨论】:

    • 这不公平,因为这不是您的答案,而是@akina 的
    • @asd-tm 我只是想将列名添加到 akina 的答案中。
    • 在这种情况下(在上下文中,它没有任何意义,也没有给@akina 的回答增加任何新意,所以它只是剽窃。
    • @asd-tm 你是对的。如果我删除答案是否公平?
    • 我认为一个公平的选择是发表评论,建议@akina 发表他/她的评论作为答案。您选择是否删除答案
    【解决方案3】:

    考虑这个查询:

    SELECT MIN(Price), MAX(Price), ProductName
    FROM Products;
    

    它应该显示哪个产品?这个怎么样:

    SELECT AVG(Price), ProductName
    FROM Products;
    

    可能没有任何产品的价格正好是平均值。那么它应该显示哪个产品?

    如果有多个产品绑定最低价格怎么办?

    这些问题以及您在问题中描述的问题的根本原因是查询不明确。您不能编写一个神奇地知道要显示哪个产品的 SQL 查询,因为该查询没有在逻辑上描述列之间的关系。

    在大多数品牌的 SQL 数据库中,此查询不是合法的 SQL。如果您使用允许它的过时 SQL 模式,则它在 MySQL 中才合法。在现代版本的 MySQL 中默认禁用此 SQL 模式,因此您显示的查询应该返回错误。

    有几种解决方案可以获得您想要的结果。这里有些例子:

    SELECT Price, ProductName FROM Products ORDER BY Price LIMIT 1;
    
    SELECT Price, ProductName
    FROM (
      SELECT Price, ProductName, RANK() OVER (ORDER BY Price) AS rnk
      FROM Products
    ) AS t
    WHERE rnk = 1;
    
    SELECT p1.Price, p1.ProductName
    FROM Products AS p1
    LEFT OUTER JOIN Products AS p2
      ON p1.Price > p2.Price
    WHERE p2.Price IS NULL;
    

    另见我对Reason for Column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause的回答

    我也在我的书SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming 的“歧义组”一章中写了这个主题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 2015-11-05
      • 1970-01-01
      • 2017-12-05
      相关资源
      最近更新 更多