0

所以,我有一张桌子,我希望显示价格最低的行......

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======= 感谢您的建议。我现在有另一个小问题。我希望为每种产品选择最低价格。有没有我可以用来执行此操作的查询?因此,例如,如果这是新的 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);

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

谢谢

4

3 回答 3

1

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

select ProductID, Quantity, Price 
FROM sellers
WHERE Price = (select MIN(Price) FROM sellers);
于 2013-02-12T23:46:04.317 回答
0

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

我的意思是,如果您在返回的值(例如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

于 2013-02-12T23:40:42.727 回答
0

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

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

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

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

请参阅带有演示的 SQL Fiddle

于 2013-02-12T23:47:25.593 回答