Это решение является самым быстрым для MySQL и будет работать с очень большими таблицами, но оно использует "прикольные" функции MySQL, поэтому не будет использоваться для других разновидностей баз данных.
(отредактировано для сортировки до применения логики)
set @count:=-1, @lane:=0;
select lane, series
from (select lane, series from lane_series order by lane, series desc) x
where if(lane != @lane, @count:=-1, 0) is not null
and if(lane != @lane, @lane:=lane, lane) is not null
and (@count:=@count+1) < 2; -- Specify the number of row at top of each group here
Чтобы поставить этот запрос на стероиды, определите индекс для дорожки и ряда: CREATE INDEX lane_series_idx on lane_series(lane, series);
, и он будет выполнять (сверхбыстрое) сканирование только по индексу, чтобы другие текстовые столбцы не влияли на него.
Хорошие моменты этого запроса:
- Требуется только один проход таблицы (хотя и отсортированный)
- Он обрабатывает связи на любом уровне, например, если есть связь для 2-го уровня, будет отображаться только один от 2-го уровня - то есть количество строк является абсолютным и никогда не будет превышено
Вот тестовый вывод:
create table lane_series (lane int, series int);
insert into lane_series values (1, 680),(1, 685),(1, 688),(2, 666),(2, 425),(2, 775);
-- Execute above query:
+------+--------+
| lane | series |
+------+--------+
| 1 | 688 |
| 1 | 685 |
| 2 | 775 |
| 2 | 666 |
+------+--------+