在MYSQL中按多列排序

时间:2011-03-22 11:50:50

标签: mysql

我正在构建一个小应用程序,按区域显示产品的最便宜价格。我需要从我的数据库中得到的结果,每个区域只显示一个结果,并且该结果必须具有该区域所有行的最低价格。

到目前为止,我已经提出了这个问题,几乎就在那里,但是混合了结果行。

SELECT `products`.`id`, `products`.`area_id`, `products`.`date`, 
`products`.`duration`, MIN(`products`.`price`) AS `price`, `products`.`rating`,
`products`.`buy_url` FROM `products` WHERE `price` >= '0' GROUP BY `products`.`area_id` ORDER BY 
`price` ASC

尽管每个区域只能成功返回一个结果,但是在这里使用MIN()似乎得到该区域的最低价格,但其他列将来自不同的行(即将在如果我没有使用上面的MIN()

所以,我显然有这个错误。对于如何从每个不同的area中选择最低价格'以及该行的其余部分,我真的很感激。

谢谢,

马特

3 个答案:

答案 0 :(得分:0)

SELECT `products`.`id`, `products`.`area_id`, `products`.`date`, `products`.`duration`, MIN(`products`.`price`) AS `price`, `products`.`rating`, `products`.`buy_url` WHERE `price` >= '0' GROUP BY `products`.`id`, `products`.`area_id`, `products`.`date`, `products`.`duration`,  `products`.`rating`, `products`.`buy_url` ORDER BY `price` ASC

您必须按所选的所有列进行分组。

答案 1 :(得分:0)

select t1.* from products as t1
inner join (
select area_id,min(price) as price
from products where price > 0
group by area_id) as t2
on t1.area_id = t2.area_id and t1.price = t2.price


alter table products add index i (area_id,price);

答案 2 :(得分:0)

这个怎么样

SELECT MIN(p1.price) AS minPrice, 
p1.id, p1.area_id, p1.date, p1.duration,p1.rating,p1buy_url 
FROM products p1
LEFT JOIN products p2
ON (p1.area_id=p2.area.id AND p1.id<p2.id)
WHERE p2.id is NULL
GROUP BY area_id 
ORDER BY p1.id ASC

注意:您不能order by在表格中不存在的字段(此处提及minPrice

  

LEFT JOIN INNER JOIN 更快,因为您可以在EXPLAIN

之前使用SELECT关键字进行检查

Reference Question