Използвайте „забавната“ функционалност на 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 |
+------+-----------+----------+