基于计数更新一组记录-MySQL


Update a set of records based on count - MySQL

我的表car中有100条活动记录。用户已决定降级其帐户,现在只有5条活动记录。我需要将95条记录的过期日期(最旧的第一条)设置为当前时间戳。我该如何在MySQL中做到这一点?如果你包含一些cakepp提示,我将非常感谢(但我只感谢你的SQL提示)

以下是我尝试的内容,但我收到一条错误消息,指出mySQL在子查询中不支持LIMIT

UPDATE cars 
SET archived = NOW()
WHERE id NOT IN (
    SELECT id
    FROM cars
    ORDER BY created DESC LIMIT 5
)
MySQL文档没有解释为什么不支持这种类型的子查询中的LIMIT子句。但是,对子查询没有这样的限制。

为了解决这个问题,让我们创建另一个子查询,并将LIMIT子句移到其中:

WHERE id NOT IN (
    SELECT id
      FROM (
        SELECT id 
          FROM cars 
          ORDER BY created 
          DESC LIMIT 5
      )
      AS carsInner
)

最里面的查询将只选择最后五行,并且存在只是为了满足子查询不应包含limit子句的要求。

最后的查询看起来像:

UPDATE cars 
  SET `archived` = NOW()
  WHERE id NOT IN (
        SELECT id
        FROM (
          SELECT id 
          FROM cars 
          ORDER BY created 
          DESC LIMIT 5
        )
        AS carsInner
    );

请在此处查看SQL Fiddle演示。