sql - 如何在关系数据库中维护每个用户最近查看的 N 个项目的列表

标签 sql database postgresql

我想跟踪用户在 PostgreSQL 数据库中查看的最后 n 个项目。我的第一个想法是创建一个表,例如

CREATE TABLE history (
  id            SERIAL PRIMARY KEY,
  user_id       integer REFERENCES users (id),
  item_id       integer REFERENCES items (id),
  view_date     timestamp DEFAULT current_timestamp
);

当用户查看一个对象时,history 表中的一个新行将记录这次查看。但我只需要为每个用户维护最后的 n 个 View ,这种方法将存储曾经出现的每个 View 。

是否有一种有效的方法可以定期删除所有用户最近超过 n 的条目?

编辑:如果有比使用 SQL 表更好的方法来存储这些数据,我很想听听。

最佳答案

delete from history
where id in (
    select id
    from (
        select
            id,
            row_number() over(
                partition by user_id
                order by view_date desc
            ) as rn
        from history
    ) s
    where rn > n
)

关于sql - 如何在关系数据库中维护每个用户最近查看的 N 个项目的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24269742/

相关文章:

mysql - 我们如何将所有页面系统对象连接到一个模式中?

php - Doctrine 找不到 PostgreSQL PDO 驱动程序?

postgresql - 在 PostgreSQL 中创建表作为选择

postgresql - PSQL错误: function does not exist

sql - T-SQL查询建议

sql - PostgreSQL,从 2 个表中选择,但仅从表 2 中选择最新元素

mysql - 在单个语句中将 mysql 表中的记录固定/标记为 true,将其余记录标记为 false

database - Liquibase 和 Terraform 最佳实践

mysql - 尝试设计/建模简单的数据库应用程序

sql - 如何将表从一个数据库复制到另一个数据库? (SQL azure )