7

次の列を持つテーブルがあるとします。

pri_iditem_idcommentdate

私が欲しいのは、特定item_idの日付より古い特定のレコードを削除する SQL クエリですが、そのレコードが 15 行を超えている場合に限りitem_idます。

これは、アイテムの 1 年以上前のコメント レコードを削除するために使用されますが、常に少なくとも 15 のレコードを保持したいと考えています。こうすれば、10 年間コメントが 1 つあった場合は削除されませんが、過去 5 日間に 100 件のコメントがあった場合、最新の 15 レコードのみを保持します。これらはもちろん、この例の任意のレコード数と日付の時間枠です。

mysql、oracle、postgres などで動作する非常に一般的な方法を見つけたいと思います。DB 抽象化に phps adodb ライブラリを使用しているので、可能であればそれでうまく動作するようにしたいと思います。

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 に答える