Будущая версия MySQL будет иметь боковое соединение
Здесь будущее. Будущее уже здесь, я запускаю запрос ниже на MySQLWorkbench с MySQLверсия 8.0.15, боковое соединение работает.
Живой тест для Postgres.MySQL 8.0.15 пока недоступен на db-fiddle.com, только его версия 8.0.12.
Живой тест: https://www.db -fiddle.com / f / jQwSuyJ8Vwr3inaty6XVk7 / 1
with lr as -- gets last row of each id
(
select tbl.*
from (select id, max(no) as max_no from tbl group by id) as ln
join tbl on (ln.id,ln.max_no) = (tbl.id,tbl.no)
)
select x.*
from lr
cross join lateral
(
select tbl.*
from tbl
where
-- valid = 1, good:
lr.valid = 1 and tbl.no = lr.no
-- valid = 0, check the one before it:
or lr.valid = 0 and tbl.id = lr.id and tbl.no < lr.no
-- optional. since it doesn't match anything here, no rows matched:
-- or lr.valid is null and 1 = 0
order by tbl.no desc
limit 1
) as x
where x.valid is not null
order by x.id;
Вывод:
| no | id | valid |
| --- | --- | ----- |
| 1 | 1 | 1 |
| 5 | 2 | 1 |
| 10 | 4 | 1 |
| 16 | 6 | 1 |
MySQL 8.0.15 доступен на dbfiddle.uk: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=95a873135d22bcfce3e59839d283e9a0
Postgres можно сделать короче, используя DISTINCT ON
вместо соединения с макс (нет):
Тест в реальном времени: https://www.db -fiddle.com / f / jQwSuyJ8Vwr3inaty6XVk7 / 2
with lr as -- gets last row of each id
(
select distinct on (id)
*
from tbl
order by id, no desc
)