为最新记录添加附加值(但显示所有记录)

Posted

技术标签:

【中文标题】为最新记录添加附加值(但显示所有记录)【英文标题】:Add additional value to the newest record (but show all records) 【发布时间】:2020-08-12 12:06:41 【问题描述】:

我必须在 MariaDB 中创建包含来自states 表的所有数据的视图:

| id | user_id | state |

但是到每个用户的最新记录(基于每个用户的最高状态 id)。我还必须添加列is_newest 并将其设置为 true (1) - 其余记录应为 false (0)。

这可以在查询中做到吗?

【问题讨论】:

更高效:mysql.rjweb.org/doc.php/groupwise_max 【参考方案1】:

如果您运行的是 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

在早期版本中,窗口函数不可用,一个选项是加入聚合查询:

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

【讨论】:

【参考方案2】:

你可以用 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。

【讨论】:

以上是关于为最新记录添加附加值(但显示所有记录)的主要内容,如果未能解决你的问题,请参考以下文章

附加信息:您无法添加或更改记录,因为表 'tblRubriek' 中需要相关记录

日记 Matlab :: 文本文件顶部的最新消息而不是附加到文件底部

SocketIO 发出函数记录但无法正常工作

Database.Log 不记录来自实体框架中的拦截器的附加 SQL

使用带有附加过滤器的 Groupby

在 Jenkins 中显示单个测试结果的历史记录 - 附加插件或配置问题?