7

假设一个包含以下列的表:

pri_id, item_id, comment,date

我想要的是一个 SQL 查询,它将删除任何记录,对于item_id比给定日期更早的特定记录,但只要有超过 15 行item_id

这将用于清除项目超过 1 年的评论记录,但我仍希望在任何给定时间保留至少 15 条记录。这样,如果我在 10 年内有一条评论,它永远不会被删除,但如果我在过去 5 天内有 100 条评论,我只会保留最新的 15 条记录。对于此示例,这些当然是任意的记录计数和日期时间范围。

我想找到一种非常通用的方法,可以在 mysql、oracle、postgres 等中使用。我正在使用 phps adodb 库进行 DB 抽象,所以如果可能的话,我希望它能够很好地工作。

4

3 回答 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
于 2008-10-16T22:33:14.067 回答
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
于 2008-10-16T22:41:00.480 回答
0

这是你要找的吗?

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

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

于 2008-10-16T22:36:19.413 回答