使用每个单独行的多个"where"子句更新多行

Dex*_*Dex 20 mysql sql sql-update

我想像这样更新我的表:

Update MyTable 
SET value     = 1 
WHERE game_id = 1,
      x       =-4,
      y       = 8

SET value     = 2 
WHERE game_id = 1,
      x       =-3,
      y       = 7

SET value     = 3 
WHERE game_id = 2,
      x       = 5,
      y       = 2
Run Code Online (Sandbox Code Playgroud)

我可以做一个foreach()但是会发送超过50个单独的查询,这非常慢.这就是我希望将它组合成一个大查询的原因.

(我确实为每一行使用了一个id,但game_id,xy的组合是我用来识别我需要的行的方法.)

这里描述的codeIgniter中的update_batch()函数: 使用CodeIgniter更新批处理 是有帮助的并且几乎完美但它只允许1个单个where子句,你不能(据我理解并尝试过)输入一个包含多个where子句的数组.

我也检查了这个问题: MYSQL UPDATE SET在同一列但有多个WHERE子句 但它只允许多行更新只包含一个不同的WHERE子句,我需要多个WHERE子句!:)

Anwsers可以使用简单的SQL,也可以使用php(和CodeIgniter)或以不同的方式使用.我想以任何可能的方式解决这个问题;)

我真的可以使用建议/帮助!= d

Joh*_*Woo 46

通过使用尝试一下 CASE

Update  MyTable 
SET     value = CASE 
                     WHEN  game_id = 1 AND x = -4 AND y = 8 THEN 1
                     WHEN  game_id = 1 AND x = -3 AND y = 7 THEN 2
                     WHEN  game_id = 2 AND x =  5 AND y = 2 THEN 3
                     ELSE  value 
                END
WHERE   game_ID IN (1,2,3) AND  -- the purpose of this WHERE clause
        x IN (-4, -3, 5) AND    -- is to optimize the query by preventing from
        y IN (8,7,2)            -- performing full table scan.
Run Code Online (Sandbox Code Playgroud)

  • 只是想补充一点:如果你不包含“CASE”的最后一行,即“ELSE value”,那么就会发生不好的事情。查询将匹配“WHERE”子句中的所有内容,不满足任何“WHEN”条件的内容将被设置为“NULL” (2认同)