Как вывести по N строк из каждой группы
Помогите правильно написать запрос, чтоб работал и для новой, и для старой версии. Нужно выводить два самых дорогих товара с каждой категории.
select category,name,price
from products
where name IN
(select top 2 price
from products as temp
where temp.category = products.category
order by price desc)
+----+----------------------------------+----------+-------+-------+
| id | name | category | count | price |
+----+----------------------------------+----------+-------+-------+
| 1 | Джинсы Mango Lonny 2 | 1 | 3 | 2990 |
| 2 | Куртка Mango Nico 2 | 2 | 2 | 4999 |
| 3 | Платье Love Republic | 3 | 7 | 3999 |
| 4 | Джинсы Mango Kim2 | 1 | 3 | 2499 |
| 5 | Жилет Zarina | 4 | 7 | 2519 |
| 6 | Юбка Mango Park | 5 | 0 | 3999 |
| 7 | Джинсы Imajeans | 1 | 6 | 1842 |
| 8 | Брюки OLBE | 7 | 5 | 2898 |
| 9 | Джинсы Mango Jane2 | 1 | 4 | 200 |
| 10 | Водолазка OPIMU | 8 | 12 | 1527 |
| 11 | Косуха Mango | 9 | 4 | 9990 |
| 12 | Джинсы Uptown2 (Mango) | 1 | 7 | 3499 |
| 13 | Жилет FinFlare | 4 | 3 | 6999 |
| 14 | Джинсы Mango Soho2 | 1 | 0 | 1999 |
| 15 | Джеггинсы Sasha Rozhdestvenskaya | 10 | 5 | 1691 |
| 16 | Плащ Vfngo SHERLOCK | 11 | 1 | 6499 |
| 17 | Юбка Katomi | 5 | 0 | 3100 |
+----+----------------------------------+----------+-------+-------+
ERROR 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '3 price
from products' at line 1
Ответы (1 шт):
Автор решения: vp_arth
→ Ссылка
На базе Вашего запроса должно сработать что-то вроде:
select category,name,price
from products p
where id IN
(select * FROM (select t.id
from products as t
where t.category = p.category
order by t.price desc
limit 2
) as sub)
Я бы ещё попробовал через счётчик.
Что-то вроде:
select category,name,price
from (
select category,name,price,
(@c:=if(@cat=category, @c+1, if(@cat:=category, 1, 1))) i
from products t
CROSS JOIN (select @c:=0, @cat:=null) c
ORDER BY category, price desc
) as p
where p.i <= 2