删除记录的SQL语句,条件是记录大于YY行且记录日期早于XXX。

7
假设有一个包含以下列的表: pri_id、item_id、comment、date 我想要的是一条SQL查询语句,它将删除特定item_id的任何记录,这些记录早于给定日期,但只要该item_id的行数超过15行。
这将用于清除1年前的评论记录,但我仍希望在任何给定时间至少保留15条记录。这样,如果我有一个评论已经存在10年,它永远不会被删除,但如果在过去5天内我有100条评论,那么我只会保留最新的15条记录。当然,这些是本例中任意的记录计数和日期时间范围。
我希望找到一种非常通用的方法,在mysql、oracle、postgres等数据库中都能使用。我正在使用phps adodb库进行数据库抽象,所以如果可能的话,我希望它能很好地与该库配合使用。
3个回答

6

这个应该适用于您:

delete
from
  MyTable
where
  item_id in
  (
    select
      item_id
    from
      MyTable
    group by
      item_id
    having
      count(item_id) > 15
  )
  and
    Date < @tDate

对于所有未来使用此查询的用户,请注意,此查询不会保留以15开头的任何item_id的初始15条记录。 - Justin Breitfeller

2
您希望始终保留至少15个,对吗?那么:
    DELETE
    FROM    CommentTable
    WHERE   CommentId NOT IN (
            SELECT  TOP 15 CommentId
            FROM    CommentTable
            WHERE   ItemId=@ItemId
            AND CommentDate < @Date
            ORDER BY CommentDate DESC
    )
    AND ItemId=@ItemId
    AND CommentDate < @Date

0

这是你要找的吗?

DELETE
    [MyTable]
WHERE
    [item_id] = 100 and
    (SELECT COUNT(*) FROM [MyTable] WHERE [item_id] = 100) > 15

我是一个 MS SQL Server 的人,但我认为它应该在其他地方也能工作。


日期捕获在哪里?再试一次! :) - Craig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接