SQL MIN函数选择行

时间:2013-02-12 23:37:32

标签: mysql sql min

所以,我有一张桌子,我希望以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

知道为什么会这样吗?

========= EDIT ======= 感谢你的建议,它的工作原理。我现在有另一个小问题。我希望为每种产品选择MIN价格。有没有我可以用来做这个的查询?因此,如果这是新的卖家表:

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);

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

由于

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

我的意思是,如果您在返回的值中有聚合(例如min(Price)avg(Price)),那么如果对其他内容存在任何歧义,则该查询不应被视为有效应返回非聚合值(例如ProductID)。你可能会认为哦,但是只有最小价格的一行,所以它可以返回那些值。但是像avg之类的其他聚合如何能够产生现在包含的值呢?或者,如果两行具有相同的最低价格怎么办?您期望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

答案 2 :(得分:0)

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

如果你在其他列上没有使用GROUP BY,那么MySQL会选择ProductIdQuantity等的值,结果会不一致。

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

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

请参阅SQL Fiddle with Demo