2008-10-16 15 views
6

Załóżmy tabelę z następującymi kolumnami:sql oświadczenie usunąć rekordy starsze niż XXX tak długo, jak istnieje ponad YY wierszy

pri_id, item_id, comment, date

Co chcę mieć to Zapytanie SQL, które usunie wszelkie rekordy dla określonego item_id starszych niż podana data, ale tylko tak długo, jak jest więcej niż 15 wierszy dla tego item_id.

To będzie używane do usuwania rekordów komentarzy starszych niż 1 rok dla przedmiotów, ale nadal chcę zachować co najmniej 15 rekordów w danym momencie. W ten sposób, gdybym miał jeden komentarz przez 10 lat, nigdy nie zostałby usunięty, ale gdybym miał 100 komentarzy w ciągu ostatnich 5 dni, zachowałbym tylko 15 najnowszych rekordów. Są to oczywiście arbitralne liczby rekordów i daty dla tego przykładu.

Chciałbym znaleźć bardzo ogólny sposób robienia tego, który działałby w mysql, oracle, postgres itp. Używam biblioteki php adodb do abstrakcji DB, więc chciałbym, żeby działała dobrze z tym, jeśli możliwy.

Odpowiedz

5

Coś jak to powinno działać dla Ciebie:

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

Dla wszystkich przyszłych użytkowników tego zapytania, należy uważać, jak to zapytanie nie będzie zachować początkowe 15 rekordy należące do dowolnej item_id który uruchamia kwerendę z 15. –

0

Czy tego szukasz?

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

Jestem facetem MS SQL Server, ale myślę, że powinien działać gdzie indziej.

+0

Gdzie jest data haczyk? Spróbuj ponownie! :) – Craig

2

Chcesz zachować co najmniej 15 z nich zawsze, prawda? Więc:

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 
Powiązane problemy