2008-10-16 77 views
6

假设有以下的表:SQL语句删除比XXX较旧的记录,只要有比YY行更

pri_iditem_idcommentdate

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

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

我想找到一个非常通用的方式来做到这一点,可以在mysql,oracle,postgres等工作。我使用phps adodb库进行数据库抽象,所以我希望它能很好地工作,如果可能。

回答

5

像这样的东西应该为你工作:

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

对于此查询的所有未来的用户,要小心,因为这个查询将不会保留原15条记录属于这个始于15 – 2012-07-09 22:05:15

0

这是你在找什么?

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

我是MS SQL Server的家伙,但我认为它应该在其他地方工作。

+0

在哪里抓的日期查询任何ITEM_ID?再试一次! :) – Craig 2008-10-16 22:37:59

2

你想保持其中至少15个,对吗?所以:

DELETE 
    FROM CommentTable 
    WHERE CommentId NOT IN (
      SELECT TOP 15 CommentId 
      FROM CommentTable 
      WHERE [email protected] 
      AND CommentDate < @Date 
      ORDER BY CommentDate DESC 
    ) 
    AND [email protected] 
    AND CommentDate < @Date