【发布时间】:2022-11-17 02:48:49
【问题描述】:
当我执行以下查询时,会出现任何产品的名称,但不会出现价格最低的产品:
SELECT MIN(Price), ProductName
FROM Products;
我怎么会看到价格最低的产品名称?
提前致谢!
【问题讨论】:
-
SELECT * FROM Products ORDER BY Price LIMIT 1
标签: mysql
当我执行以下查询时,会出现任何产品的名称,但不会出现价格最低的产品:
SELECT MIN(Price), ProductName
FROM Products;
我怎么会看到价格最低的产品名称?
提前致谢!
【问题讨论】:
SELECT * FROM Products ORDER BY Price LIMIT 1
标签: mysql
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
【讨论】:
SELECT 'productName' FROM Products ORDER BY Price LIMIT 1
感谢@akina
【讨论】:
考虑这个查询:
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;
我也在我的书SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming 的“歧义组”一章中写了这个主题。
【讨论】: