Выборка данных из таблицы с лимитом и разными условиями

Temp1ar

Новичок
Выборка данных из таблицы с лимитом и разными условиями

Привет, ребята, у меня вопрос :)

Есть таблица
PHP:
mysql> SELECT * FROM test;
+-------+------+
| group | sort |
+-------+------+
| a     |    1 | 
| a     |    2 | 
| a     |    3 | 
| a     |    4 | 
| b     |    1 | 
| b     |    2 | 
| b     |    3 | 
| b     |    5 | 
+-------+------+
Можно ли одним запросом, не используя UNION SELECT вернуть по 2 элемента из каждой группы с максимальными значениями sort, то есть:
PHP:
+-------+------+
| group | sort |
+-------+------+
| a     |    3 | 
| a     |    4 | 
| b     |    3 | 
| b     |    5 | 
+-------+------+
Есть идеи насчёт временных таблиц, но может есть способ проще?
 

alpine

Новичок
Temp1ar
Можно попробовать вот так, но это только в научных целях
[sql]
SET @cnt = 0, @grp='';
SELECT
t.`group`,
t.sort
FROM (
SELECT
t.*, IF( @grp<>t.group, @cnt:=1, @cnt:=@cnt+1 ) as ordered_sort, @grp:=t.`group`
FROM test as t
ORDER BY t.`group`, t.sort DESC
) t
WHERE ordered_sort <= 2
ORDER BY t.`group`, t.sort
;
[/sql]
 

Gas

может по одной?
alpine
позволю себе тебя дополнить :)
если есть индекс (`group`, `sort`) - лучше во вложенном запросе DESC и для t.group

Temp1ar
а если в таблице test есть ещё вереница полей, особенно varchar, text etc - можно во внутреннем вытягивать не t .*, а явно поля `group`, `sort` (составной индекс) и потом полученные максимальные значения сджойнить с этой эе таблицей для получения всех полей.
 

Temp1ar

Новичок
Gas
Дело в том, что время одного запроса в большой таблице порядка 50 миллисекунд, таких запросов около 10-ти. Суммарное время: 0.5 секунды. Если объединяю с UNION время даже увеличивалось до 0.8 секунды при нескольких измерениях.
 

Gas

может по одной?
тогда стоило спрашивать не как сделать без union'а, а что сделать чтоб стало работать быстрее. Потому что вариант с union'ами на большой таблице при правильных индексах, будет быстрее чем fullscan, который привёл alpine, о чём он и написал "это только в научных целях".
 
Сверху