SQL-оператор для удаления записей старше XXX, если строк больше YY - PullRequest
6 голосов
/ 17 октября 2008

Предположим таблицу со следующими столбцами:

pri_id, item_id, comment, date

Мне нужен SQL-запрос, который удалит все записи для конкретного item_id, который старше указанной даты, НО только до тех пор, пока для этого item_id. Имеется более 15 строк.

Это будет использоваться для очистки записей комментариев старше 1 года для элементов, но я все еще хочу хранить как минимум 15 записей в любой момент времени. Таким образом, если бы у меня был один комментарий в течение 10 лет, он никогда не был бы удален, но если бы у меня было 100 комментариев за последние 5 дней, я бы сохранил только самые последние 15 записей. Это, конечно, произвольное количество записей и сроки для данного примера.

Я бы хотел найти очень общий способ сделать это, который бы работал в mysql, oracle, postgres и т. Д. Я использую библиотеку phps adodb для абстракции БД, поэтому я хотел бы, чтобы она работала хорошо с этим, если это возможно .

Ответы [ 3 ]

5 голосов
/ 17 октября 2008

Что-то вроде этого должно работать для вас:

delete
from
  MyTable
where
  item_id in
  (
    select
      item_id
    from
      MyTable
    group by
      item_id
    having
      count(item_id) > 15
  )
  and
    Date < @tDate
2 голосов
/ 17 октября 2008

Вы хотите сохранить как минимум 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 голосов
/ 17 октября 2008

Это то, что вы ищете?

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

Я парень по MS SQL Server, но я думаю, что он должен работать в другом месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...