2008-10-16 35 views
6

Giả sử một bảng với các cột sau:câu lệnh SQL để xóa các bản ghi cũ hơn XXX miễn là có hơn hàng YY

pri_id, item_id, comment, date

Những gì tôi muốn có một là Truy vấn SQL sẽ xóa mọi bản ghi, cho một item_id cụ thể cũ hơn một ngày cụ thể, NHƯNG chỉ miễn là có hơn 15 hàng cho số item_id đó.

Điều này sẽ được sử dụng để thanh lọc các bản ghi nhận xét cũ hơn 1 năm cho các mục nhưng tôi vẫn muốn giữ ít nhất 15 bản ghi tại bất kỳ thời điểm nào. Bằng cách này, nếu tôi có một bình luận trong 10 năm, nó sẽ không bao giờ bị xóa nhưng nếu tôi có 100 ý kiến ​​trong 5 ngày qua, tôi chỉ giữ 15 hồ sơ mới nhất. Đây là tất nhiên số lượng bản ghi tùy ý và khung thời gian ngày cho ví dụ này.

Tôi muốn tìm một cách rất chung chung để làm điều này mà sẽ làm việc trong mysql, oracle, postgres vv. Tôi đang sử dụng thư viện adodb phps cho DB trừu tượng vì vậy tôi muốn nó hoạt động tốt với điều đó nếu khả thi.

Trả lời

5

Something như thế này nên làm việc cho bạn:

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

Đối với tất cả người dùng trong tương lai của truy vấn này, hãy cẩn thận vì truy vấn này sẽ không lưu giữ 15 bản ghi ban đầu thuộc bất kỳ item_id nào bắt đầu truy vấn với 15. –

0

Đây có phải là những gì bạn đang tìm kiếm?

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

Tôi là một anh chàng MS SQL Server, nhưng tôi nghĩ rằng nó sẽ hoạt động ở nơi khác.

+0

Bắt ngày tháng ở đâu? Thử lại! :) – Craig

2

Bạn muốn giữ ít nhất 15 trong số chúng luôn đúng không? Vì vậy:

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 
Các vấn đề liên quan