【问题标题】:SQL MIN function selecting rowSQL MIN 函数选择行
【发布时间】:2013-01-28 10:19:50
【问题描述】:

所以,我有一张表,我希望显示价格为 MIN 的行...

sellers - saleid, productsid[fk for products table], cid[fk for customers table], quantity
price.

这里有一些记录:

sellers =1,2,2,200,5.00
sellers=2,3,4,100,1.00

我做这个查询:

select ProductID, Quantity, MIN(Price) FROM sellers

我得到了这个输出

2,200,1.00

为什么它显示的是最低价格但是第一个记录列? 它应该显示,即相应的行...

3,4,1.00

知道这是为什么吗?

=========编辑======= 感谢您的建议,它的工作原理。我现在有另一个小问题。我希望为每种产品选择最低价格。有没有我可以用来执行此操作的查询?因此,例如,如果这是新的 Sellers 表:

sellers =1,2,2,200,5.00
sellers=2,3,4,100,1.00
seller=3,2,3,250,3.00

那么产品 2,3 的最低价格将是

sellers=2,3,4,100,1.00
seller=3,2,3,250,3.00

如何使用 min 函数做这样的事情?我试过了

select c.Fname p.ProductName, s.ProductID, s.Quantity, s.Price 
FROM sellers s, products p, customer c
WHERE s.Price = (select MIN(Price) FROM sellers WHERE p.ID=s.ProductID AND c.ID=s.cid);

然而,这似乎并没有输出每个独特产品的最低价格。关于如何纠正这个问题的任何想法?

谢谢

【问题讨论】:

  • 当您在GROUP BY 子句中还包含非聚合列时,使用聚合函数(例如MIN())时应该会得到更一致的结果。

标签: mysql sql min


【解决方案1】:

如果没有 GROUP BY,聚合函数 MIN() 将应用于所有行。为了将价格与整个表中的最小值进行比较,您需要一个子查询:

select ProductID, Quantity, Price 
FROM sellers
WHERE Price = (select MIN(Price) FROM sellers);

【讨论】:

  • 我现在有个小问题。我有一个带有产品 ID 的产品表、列出的卖家表、客户表和一个请求表。我想输出特定产品的最低价格供应商我正在运行此查询,但它似乎没有输出指定产品的最低价格,只是表中的最低价格...这里是查询:select c.FName, p.ProductName, s.Price FROM customers c, products p, sellers s, requests r WHERE s.Price = (select MIN(Price) From sellers WHERE s.ProductID= r.ProductID AND c.ID=s.C_ID AND p.ProductID=s.ProductID)跨度>
  • 我希望它显示最便宜的卖家,其中 request.ProductID = Sellers.ProductID... 即显示用户要求的最便宜的产品...不是最便宜的产品在卖方表中,这是目前正在发生的事情。我怎么能修改这个查询?谢谢
【解决方案2】:

这是因为您在(隐式)聚合查询中选择了非聚合列,而不进行聚合。事实上,我很惊讶这个查询是有效的。

我的意思是,如果您在返回的值中有聚合(例如 min(Price) 或 avg(Price)),如果其他非聚合值存在任何歧义,则该查询不应被视为有效(例如ProductID)应该返回。您可能会想,哦,但只有一行具有最低价格,因此它可以从中返回值。但是像avg 这样可以产生包含在 no now 中的值的其他聚合呢?或者如果两行的最低价格相同怎么办?您希望 select ProductID, Quantity, AVG(Price) FROM sellers 返回什么行的值?

你想要这样的东西:

select ProductID, Quantity, Price from sellers s1 where Price <= all (select price from sellers s2)

或者

select ProductID, Quantity, Price from sellers s1 order by price asc limit 1

【讨论】:

  • @johnny 正如您从所有答案中看到的那样,有一百种不同的方法可以编写 SQL 查询以获得相同的结果:)
  • 我遇到了另一个小问题。我在这里问了这个问题:[link]stackoverflow.com/questions/14912289/…你知道如何在这样的事情上帮助我吗?
【解决方案3】:

问题是您没有使用 GROUP BY 并且您想要不在聚合函数中的列。

如果你不在其他列上使用GROUP BY,那么 MySQL 会为ProductId、Quantity 等选择值,结果将不一致。

最好的办法是使用子查询:

select *
from sellers s1
inner join
(
  select min(price) MinPrice
  from sellers
) s2
  on s1.price = s2.minprice;

见SQL Fiddle with Demo

【讨论】:

  • 非常感谢您的帮助:D
  • 我现在有个小问题。我有一个带有产品 ID 的产品表、列出的卖家表、客户表和一个请求表。我想输出特定产品的最低价格供应商 我正在运行此查询,但它似乎没有输出指定产品的最低价格,只是表中的最低价格...这里是查询:选择 c.FName, p.ProductName, s.Price FROM customers c, products p, Sellers s, requests r WHERE s.Price = (select MIN(Price) From Sellers WHERE s.ProductID= r.ProductID AND c.ID=s.C_ID AND p .ProductID=s.ProductID)
  • 我希望它显示最便宜的卖家,其中 request.ProductID = Sellers.ProductID... 即显示用户要求的最便宜的产品...不是最便宜的产品在卖方表中,这是目前正在发生的事情。我怎么能修改这个查询?谢谢
  • @johnny 如果您还有其他问题,那么您应该发布一个新问题。
  • 谢谢伙计,我会这样做的:)
猜你喜欢
  • 2021-05-06
  • 2016-03-22
  • 2015-05-05
  • 2011-10-29
  • 1970-01-01
  • 2018-07-23
  • 2016-07-31
  • 2015-07-04
  • 2022-12-05
相关资源
最近更新 更多