如果 count(*) > n 更新行

Fra*_*ipe 5 mysql sql insert sql-update

我的数据库具有以下结构:

ID | text | time | valid
Run Code Online (Sandbox Code Playgroud)

这是我目前的代码。我试图找到一种方法来做到这一点作为一个查询。

rows = select * from table where ID=x order by time desc;
n=0;
foreach rows{
    if(n > 3){
       update table set valid = -1 where rows[n]; 
    }
    n++
}
Run Code Online (Sandbox Code Playgroud)

我正在检查给定 ID 存在多少行。然后我需要为 n > 3 的所有行设置 valid=-1;

有没有办法通过一个查询来做到这一点?

das*_*ght 5

您可以在WHERE子句中使用子查询,如下所示:

UPDATE table
   SET valid=-1
 WHERE (
         SELECT COUNT(*)
           FROM table tt
          WHERE tt.time > table.time
            AND   tt.ID = table.ID
) > 3
Run Code Online (Sandbox Code Playgroud)

子查询计算具有相同 ID 和稍后时间的行。对于最近的三行,此计数将为三或更少;其余的将有更大的计数,因此它们的valid字段将被更新。


ype*_*eᵀᴹ 2

假设(id,time)有一个UNIQUE约束,即没有两行具有相同id和相同time

UPDATE 
    tableX AS tu
  JOIN
    ( SELECT time
      FROM tableX
      WHERE id = @X                      -- the given ID
      ORDER BY time DESC
      LIMIT 1 OFFSET 2
    ) AS t3
    ON  tu.id = @X                       -- given ID again
    AND tu.time < t3.time 
SET
    tu.valid = -1 ;
Run Code Online (Sandbox Code Playgroud)