微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐