Mysql 根据另一列 latest/max 获取最新的 record/row

Mysql get latest record/row based on another columns latest/max

我有一个table这样的

id name version ref_id deleted
1 a 1 1 1
2 b 3 1 0
3 c 2 1 1
4 a 3 2 1
5 bb 1 2 0
6 cc 2 2 0

我想要实现的是 select 具有最新版本的行

id name version ref_id deleted
2 b 3 1 0
4 a 3 2 1

这是我原来的方法,但现在对我们的系统来说太慢了:

select t.*
from (
    select ref_id, max(version) as version
    from table1
    group by ref_id
) latest
inner join table1 t on t.ref_id = latest.ref_id and t.version = latest.version

有没有办法做类似的事情:

select if(version = max(version), id, other columns) from table group by ref_id ?

在 MySQL 8 或更高版本中,您可以使用 row_number window 函数:

with cte as (
    select *, row_number() over (partition by ref_id order by version desc) as rn
    from t
)
select *
from t
where rn = 1

对于 MySQL 的早期版本,您现有的方法是最好的,但值得尝试的替代解决方案:

select *
from t
where (ref_id, version) in (
    select ref_id, max(version)
    from t
    group by ref_id
)