我正在构建一个小应用程序,按区域显示产品的最便宜价格。我需要从我的数据库中得到的结果,每个区域只显示一个结果,并且该结果必须具有该区域所有行的最低价格。
到目前为止,我已经提出了这个问题,几乎就在那里,但是混合了结果行。
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
中选择最低价格'以及该行的其余部分,我真的很感激。
谢谢,
马特
答案 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
关键字进行检查