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