为最新记录添加附加值(但显示所有记录)
Add additional value to the newest record (but show all records)
我必须在 MariaDB 中创建视图,其中包含来自 states
table 的所有数据:
| id | user_id | state |
而是给每个用户最新的记录(根据每个用户状态的最高id)。我还必须添加 columnis_newest
并将其设置为 true (1
) - 其余记录应该为 false (0
).
这可以在查询中执行吗?
如果你是 运行 MariaDB 10.3 或更高版本,你可以使用 row_number()
:
create view states_view as
select
id,
user_id,
state,
(row_number() over(partition by user_id order by id desc) = 1) is_newest
from states
在早期版本中,window 函数不可用,一种选择是加入聚合查询:
create view states_view as
select
s.id,
s.user_id,
s.state,
(s.id = m.max_id) is_newest
from states s
inner join (select user_id, max(id) max_id from states group by user_id) m
on m.user_id = s.user_id
你可以使用 NOT EXISTS:
select s.*,
(not exists(select 1 from states where user_id = s.user_id and id > s.id)) is_newest
from states s
查看简化版 demo。
我必须在 MariaDB 中创建视图,其中包含来自 states
table 的所有数据:
| id | user_id | state |
而是给每个用户最新的记录(根据每个用户状态的最高id)。我还必须添加 columnis_newest
并将其设置为 true (1
) - 其余记录应该为 false (0
).
这可以在查询中执行吗?
如果你是 运行 MariaDB 10.3 或更高版本,你可以使用 row_number()
:
create view states_view as
select
id,
user_id,
state,
(row_number() over(partition by user_id order by id desc) = 1) is_newest
from states
在早期版本中,window 函数不可用,一种选择是加入聚合查询:
create view states_view as
select
s.id,
s.user_id,
s.state,
(s.id = m.max_id) is_newest
from states s
inner join (select user_id, max(id) max_id from states group by user_id) m
on m.user_id = s.user_id
你可以使用 NOT EXISTS:
select s.*,
(not exists(select 1 from states where user_id = s.user_id and id > s.id)) is_newest
from states s
查看简化版 demo。