【问题标题】:Update multiple rows with multiple 'where' clauses for each individual row使用每个单独行的多个“where”子句更新多行
【发布时间】:2013-02-26 22:57:00
【问题描述】:

我正在尝试像这样更新我的表格:

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

我可以发送foreach(),但这会发送超过 50 个单独的查询,这非常慢。 这就是为什么我希望将其合并为 1 个大查询。

(我确实为每一行使用了一个 id,但 game_idxy 的组合是我用什么来识别我需要的行。)

此处描述的 codeIgniter 的 update_batch() 函数: Update batch with CodeIgniter 很有帮助,几乎完美,但它只允许 1 个单独的 where 子句,你不能(据我理解和尝试)输入一个包含多个 where 子句的数组。

我也检查了这个问题: MYSQL UPDATE SET on the Same Column but with multiple WHERE Clauses 但它只允许只包含一个不同的 WHERE 子句的多行更新,我需要多个 WHERE 子句! :)

Anwsers 可以是简单的 SQL 或使用 php(和 CodeIgniter)或以不同的方式。我希望以任何可能的方式解决这个问题;)

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

【问题讨论】:

    标签: mysql sql sql-update


    【解决方案1】:

    使用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.
    

    【讨论】:

    • 谢谢!我现在就去试试看!
    • 一定要先备份你的数据库:D
    • 只是想补充一点:如果你不包括CASE 的最后一行,即ELSE value,那么就会发生不好的事情。查询将匹配WHERE 子句中的所有内容,不满足任何WHEN 条件的内容将设置为NULL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多