mysql-SQL:删除每个用户除最后X条消息以外的旧消息

我正在建立一个活动流,因此旧消息会逐渐消失并且永远不会再被看到.因此,我想定期删除邮件.但是,我不希望用户看起来没有任何活动,因此我想在每个信息流中至少保留X个帖子.

简化后,我的“消息”表具有一个“中间”(消息ID,主键),一个“ uid”(用户ID),一个“创建”日期(UNIX时间戳)和一个“消息”.所以我想要做的是这样的事情:

DELETE FROM messages
WHERE created < ? AND mid NOT IN (
    SELECT mid FROM messages m GROUP BY uid HAVING mid > (
        SELECT mid FROM messages WHERE uid = m.uid ORDER BY mid LIMIT 1 OFFSET ?
    )
)

但是,当我自己尝试在NOT IN()内部进行查询时,它不返回任何结果.另外,我认为从您要从中删除的同一表中进行SELECT无效.

如有必要,我可以进行2个查询,但我希望没有必要.

我尝试四处搜索,关于如何删除除最后一条记录以外的所有记录有很多结果,但是我没有找到有关删除除最后N条记录以外的所有记录的任何信息.

解决方法:

查看此问题,以解决“每组前n个”问题的[MysqL]解决方案:

How to SELECT the newest four items per category?

一旦有了由“每组前n个”中的所有行组成的集合(这就是您要保留的内容).您只需要删除不在该集合中的那些行:

delete x
where x.mid not in ( select mid
                     -- where top n per group criteria
                   )

这是另一个研究相同问题的链接

http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...