标签:postgresql sql mysql
我正在建立一个活动流,因此旧消息会逐渐消失并且永远不会再被看到.因此,我想定期删除旧邮件.但是,我不希望用户看起来没有任何活动,因此我想在每个信息流中至少保留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/
标签:postgresql,sql,mysql 来源: https://codeday.me/bug/20191208/2089448.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。