mysql - объединить первую и последнюю записи по типу группы? - PullRequest
1 голос
/ 05 января 2012

С таблицей типа:

idx type dat
0   a    foo1
1   b    foo2
2   c    foo3
3   a    foo4
4   b    foo5
5   c    foo6
6   a    foo7
7   b    foo8
8   c    foo9

Как я могу получить первые и последние данные каждого типа:

например:

a foo1 foo7
b foo2 foo8
c foo3 foo9

У меня естьпробовал этот запрос, но его способ замедлиться, даже с индексами на idx и типе:

select mins.type, mins.dat, mytable.dat from mytable

--get the maximums
inner join
 (select max(idx) as maxidx from mytable group by type) as a
on a.maxidx = mytable.idx


--join the maximums to the minimums
inner join

--get the minimums
 (select * from mytable inner join (select min(idx) as minidx from mytable group by type) as b 
on b.minidx = mytable.idx ) as mins

on issues.type = mins.type

Объединение on questions.type = mins.type, похоже, и сильно его замедляет, потому что mins.type является производным и не проиндексирован?

1 Ответ

1 голос
/ 05 января 2012

Используйте "фанки" функциональность mysql для GROUP BY без агрегирования других столбцов, что просто возвращает первую строку группы. Затем возникает проблема получения строк в правильном порядке до с использованием этой функции, обычно с использованием псевдонима запроса.

Этот подход позволяет избежать любых коррелированных подзапросов (запросов на строку) и требует всего два прохода по таблице (по одному для каждого направления упорядочения):

select x2.type, x2.dat as first_dat, y2.dat as last_dat
from (select *
  from (select type, dat
    from so8735514
    order by 1, 2) x1
  group by 1) x2
join (select *
  from (select type, dat
    from so8735514
    order by 1, 2 desc) y1
  group by 1) y2 on y2.type = x2.type;

Тестовый код:

create table so8735514 (idx int, type text, dat text);
insert into so8735514 values
(0, 'a', 'foo1'),
(1, 'b', 'foo2'),
(2, 'c', 'foo3'),
(3, 'a', 'foo4'),
(4, 'b', 'foo5'),
(5, 'c', 'foo6'),
(6, 'a', 'foo7'),
(7, 'b', 'foo8'),
(8, 'c', 'foo9');

Выход:

+------+-----------+----------+
| type | first_dat | last_dat |
+------+-----------+----------+
| a    | foo1      | foo7     |
| b    | foo2      | foo8     |
| c    | foo3      | foo9     |
+------+-----------+----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...