1

私は現在使用しています:

SELECT * FROM users ORDER BY date_time DESC LIMIT 0, 80

最新の 80 件のユーザー名を表示するには、この 80 件を超える他のエントリを削除するようにクエリを作成するにはどうすればよいですか?

cron ジョブが必要だと思いますが、どのようなクエリを実行する必要がありますか?

4

5 に答える 5

5

さまざまな方法を次に示します。

delete users from users
LEFT JOIN
(
  select id from users order by date_time DESC LIMIT 0, 80) t1 ON users.id=t1.id
where t1.id is null

SQL フィドルのデモ

制限なし:

delete users from users
LEFT JOIN
(
  select id from
(
SELECT  id, 
        @curRow := @curRow + 1 AS row_number
FROM    users,(SELECT @curRow := 0) r
ORDER BY date_time DESC) t where row_number<=80
) t1 ON users.id=t1.id
where t1.id is null

SQLFiddle デモ

于 2013-07-17T13:08:24.470 に答える
1

テストされていませんが、ユーザー変数を使用してシーケンス番号を割り当てる可能性があります:-

DELETE users
FROM users
INNER JOIN
(
    SELECT ID, @Sequence:=@Sequence + 1 AS aSequence
    FROM (SELECT ID, date_time FROM users ORDER BY date_time) a
    CROSS JOIN (SELECT @Sequence:=0) b
) c
ON users.ID = c.ID
AND c.aSequence > 80
于 2013-07-17T13:43:19.660 に答える
1

サブクエリを使用する必要があります

DELETE FROM USERS where ID NOT IN
(SELECT ID FROM users ORDER BY date_time DESC LIMIT 0, 80)

削除時に制限を使用できないため

于 2013-07-17T13:07:58.887 に答える
1

を使って試してみてくださいLEFT JOIN

DELETE  a
FROM    users a
        LEFT JOIN
        (
            SELECT  ID
            FROM    users
            ORDER   BY date_time DESC 
            LIMIT   0, 80
        ) b ON a.ID = b.ID
WHERE   b.ID IS NULL
于 2013-07-17T13:11:42.370 に答える
0

中間サブクエリを使用するのはどうですか? ちょっとした考え。

DELETE FROM `users`
   WHERE id NOT IN (
      SELECT id
      FROM (
         SELECT id
         FROM `users`
         ORDER BY date_time DESC
         LIMIT 80 
   ) AS q
);
于 2013-07-17T13:29:59.107 に答える