删除最近80后的MYSQL值

时间:2013-07-17 13:06:08

标签: php mysql sql

我目前正在使用:

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

显示80个最新的用户名,如何进行查询,以便删除此80之后的任何其他条目?

我认为我需要一个cron作业,但它需要执行什么样的查询?

5 个答案:

答案 0 :(得分: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 Fiddle demo

并且没有LIMIT:

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 demo

答案 1 :(得分:1)

您需要使用子查询

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

因为您在删除时无法使用限制

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:0)

使用中间子查询怎么样?只是一个想法。

DELETE FROM `users`
   WHERE id NOT IN (
      SELECT id
      FROM (
         SELECT id
         FROM `users`
         ORDER BY date_time DESC
         LIMIT 80 
   ) AS q
);