1

次の列を持つ「user-recent-activity」という名前のテーブルがあります:id、userid、activity、およびdatetime。ここで、一意のユーザー ID に 50 を超えるアイテムがある場合にレコードを削除し、最も古いレコードを削除したいと考えています。たとえば、ユーザー ID (1234 としましょう) がこのテーブルに 50 を超えるレコードを持っている場合、ユーザー ID (1234) の最新の 50 レコードを保存し、最も古いレコードを削除する必要があります。

4

3 に答える 3

3

挿入する前に、その ID を持つ最後の 50 レコードを照会します (新しいものから古いものへの順序付け)。50 番目がある場合、新しい行を挿入する代わりに (更新を介して) 置き換えます。

于 2012-07-20T00:52:58.510 に答える
1

標準 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 値を渡すことができるはずです...

それが役立つことを願っています

于 2012-07-20T00:55:18.297 に答える
0

ランク メソッドを使用して行数を正確に定義し、必要な行を削除できます。

 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
于 2012-07-20T01:20:09.333 に答える