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
)
我有一个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
)