WHERE id IN()语句中的多个相同id

lor*_*tyx 5 mysql

我有一个简单的查询,将字段的值增加1.现在,我习惯循环遍历所有id并为每个id激发一个查询,但是现在事情变得有点重,我想优化它.通常我会这样做

UPDATE table SET field = field + 1 WHERE id IN (all the ids here)
Run Code Online (Sandbox Code Playgroud)

但是现在我遇到的问题是,有两次出现的id(或更多,我在正手上无法知道).如果查询如下所示,有没有办法让id 4运行两次查询:

UPDATE table SET field = field + 1 WHERE id IN (1, 2, 3, 4, 4, 5)
Run Code Online (Sandbox Code Playgroud)

谢谢,

lordstyx

编辑:抱歉不够清楚.这里的id是一个auto inc字段,所以它都是唯一的ID.必须更新的id是间接来自用户的,所以我无法预测哪个id会频繁发生.如果有ID(1,2,3,4,5,5),我需要id为4的行的字段增加2,其余的则为1.

ype*_*eᵀᴹ 0

如果(1, 2, 3, 4, 4, 5)来自SELECT id ...查询,那么您可以执行以下操作:

UPDATE yourTable 
  JOIN 
    ( SELECT id
           , COUNT(id) AS counter 
      ....
      GROUP BY id
    ) AS data
    ON yourTable.id = data.id
SET yourTable.field = yourTable.field + data.counter 
;
Run Code Online (Sandbox Code Playgroud)

由于输入来自用户,也许您可​​以对其进行一些操作。改成。(1, 2, 3, 4, 4, 5)(1), (2), (3), (4), (4), (5)

然后(创建临时表):

CREATE TABLE tempUpdate
( id INT )
;
Run Code Online (Sandbox Code Playgroud)

执行以下过程:

  1. 添加临时表中的值,
  2. 运行更新并
  3. 删除值。

代码:

INSERT INTO TempUpdate
VALUES (1), (2), (3), (4), (4), (5)
;

UPDATE yourTable 
  JOIN 
    ( SELECT id
           , COUNT(id) AS counter 
      FROM TempUpdate
      GROUP BY id
    ) AS data
    ON yourTable.id = data.id
SET yourTable.field = yourTable.field + data.counter 
;

DELETE FROM TempUpdate
;
Run Code Online (Sandbox Code Playgroud)