次の列を持つ「user-recent-activity」という名前のテーブルがあります:id、userid、activity、およびdatetime。ここで、一意のユーザー ID に 50 を超えるアイテムがある場合にレコードを削除し、最も古いレコードを削除したいと考えています。たとえば、ユーザー ID (1234 としましょう) がこのテーブルに 50 を超えるレコードを持っている場合、ユーザー ID (1234) の最新の 50 レコードを保存し、最も古いレコードを削除する必要があります。
3 に答える
挿入する前に、その ID を持つ最後の 50 レコードを照会します (新しいものから古いものへの順序付け)。50 番目がある場合は、新しい行を挿入する代わりに (更新を介して) 置き換えます。
標準 SQL をサポートする RDBMS を使用していると仮定すると、次のストアド プロシージャで実行できます。
create procedure remove-old-activities ( @userid int ) as delete from user-recent-activity where userid=@userid and id not in (userid=@userid order by datetime desc の user-recent-activity から上位 50 の ID を選択)
DB がストアド プロシージャをサポートしていない場合は、SQL パラメータを使用してユーザー ID 値を渡すことができるはずです...
それが役立つことを願っています
ランク メソッドを使用して行数を正確に定義し、必要な行を削除できます。
delete from tblName where id=
(select id from (
select @i := CASE WHEN ( @userid <> userid ) THEN 1
ELSE @i+1
END AS rank , id,userid, datetime2 ,@userid:=userid AS clset
from tblName x,(SELECT @i:=0) a ,(SELECT @userid:= 0) s
order by x.userid, datetime2 desc) T
where T.rank='50') ;
別のオプション: select クエリを使用してランク <=50 を選択し、新しいテーブルに挿入します。古いテーブルを削除し、後で新しいテーブルの名前を変更します。
insert into newtable (userid,activity,datetime2)
select userid,datetime2 from (
select @i := CASE WHEN ( @userid <> userid ) THEN 1
ELSE
@i+1
END AS rank , userid, activity,datetime2 ,@userid:=userid AS clset
from tblName x,(SELECT @i:=0) a ,(SELECT @userid:= 0) s
order by x.userid, datetime2 desc) T
where t.rank <=50