所以,我有一张桌子,我希望以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);
然而,这似乎没有输出每个独特产品的最低价格。关于如何纠正这个问题的任何想法?
由于
答案 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会选择ProductId
,Quantity
等的值,结果会不一致。
最好的办法是使用子查询:
select *
from sellers s1
inner join
(
select min(price) MinPrice
from sellers
) s2
on s1.price = s2.minprice;