2

ユーザーに割り当てられた数十万行のテーブルがあります。例えば:

itemid | userid | etc
1      | 1      | etc
2      | 1      | etc
3      | 1      | etc
4      | 3      | etc
5      | 3      | etc
6      | 3      | etc
etc    | etc    | etc

ユーザーには、任意の数のアイテムを割り当てることができます。つまり、0 から無限大までの任意の数。私の問題は、各ユーザーのすべてのアイテムを削除するが、20 を保持する SQL クエリが必要なことです。ユーザーに 20 未満のアイテムが割り当てられている場合、たとえば 10 アイテムのみが割り当てられている場合、10 個すべてを保持する必要があります。

それ、どうやったら出来るの?

アップデート

ユーザーが ID 1 ~ 50 の 50 個のアイテムを持っている場合、アイテム 30 ~ 50 を返す必要があります。つまり、そのユーザーが最後に挿入した 20 個のアイテムです。

4

4 に答える 4

0

そのコードは次のように機能します。

  • 新しい列を作成します: count - 各ユーザーのアイテムをカウントします
  • itemid の降順で結果を並べ替えます - ユーザーの最初のイベントが最高の ID を取得するようにします
  • カウントが 20 を超えるすべての行を選択/削除します - 最後の 20 (またはそれ以下) のイベントはそのまま残します

選択する:

SET @count=1;
SET @last_user_id=0;

SELECT * FROM (
SELECT *,
case 
when (@last_user_id = userid) 
then 
@count:=@count+1
else @count:=1 end as count,
case 
when (@last_user_id!=userid) 
then 
@last_user_id:=userid
end
as new
FROM <tablename> ORDER BY userid, itemid DESC) AS inner_table WHERE count > 20

消去:

SET @count=1;
SET @last_user_id=0;

DELETE FROM (
SELECT *,
CASE 
WHEN (@last_user_id = userid) 
THEN  
@count:=@count+1
ELSE 
@count:=1 
END 
AS count,
CASE 
WHEN (@last_user_id!=userid) 
THEN  
@last_user_id:=userid
END 
AS new
FROM <tablename> ORDER BY userid, itemid DESC) AS inner_table WHERE count > 20
于 2013-04-22T12:53:02.170 に答える
0

これを試して

     delete from Fruits where itemid  
     not in (select itemid from (select itemid from Fruits where userid = 1
     ORDER BY itemid desc limit 20)x  )
     and userid=1

デモはこちら

于 2013-04-22T12:40:40.320 に答える
-1

これは私のために働いた:

DELETE FROM table WHERE itemid NOT IN ( 
      SELECT itemid 
        FROM ( 
          SELECT * 
          FROM table
          WHERE userid = 1
          ORDER BY itemid  DESC 
          LIMIT 20
        ) x 
    ) 
    AND userid = 1
于 2013-04-22T12:39:04.580 に答える