私は現在使用しています:
SELECT * FROM users ORDER BY date_time DESC LIMIT 0, 80
最新の 80 件のユーザー名を表示するには、この 80 件を超える他のエントリを削除するようにクエリを作成するにはどうすればよいですか?
cron ジョブが必要だと思いますが、どのようなクエリを実行する必要がありますか?
さまざまな方法を次に示します。
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
制限なし:
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
テストされていませんが、ユーザー変数を使用してシーケンス番号を割り当てる可能性があります:-
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
サブクエリを使用する必要があります
DELETE FROM USERS where ID NOT IN
(SELECT ID FROM users ORDER BY date_time DESC LIMIT 0, 80)
削除時に制限を使用できないため
を使って試してみてください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
中間サブクエリを使用するのはどうですか? ちょっとした考え。
DELETE FROM `users`
WHERE id NOT IN (
SELECT id
FROM (
SELECT id
FROM `users`
ORDER BY date_time DESC
LIMIT 80
) AS q
);