Обновление нескольких строк с несколькими предложениями "where" для каждой отдельной строки - программирование
Подтвердить что ты не робот

Обновление нескольких строк с несколькими предложениями "where" для каждой отдельной строки

Я пытаюсь обновить таблицу следующим образом:

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 отдельных запросов, которые очень медленные. Вот почему я хочу, чтобы он был объединен в один большой запрос.

(для каждой строки используется id, но комбинация game_id, x и y что я использую для определения нужной строки.)

Функция update_batch() от codeIgniter, описанная здесь: Обновить пакет с помощью CodeIgniter был полезен и почти идеален, но он допускает только одно предложение where, вы не можете (насколько я понял и попытался) ввести массив с несколькими предложениями.

Я также проверил этот вопрос: MYSQL UPDATE SET в том же столбце, но с несколькими предложениями WHERE Но это разрешает только несколько обновлений строк, содержащих только одно другое предложение WHERE, и мне нужно несколько предложений WHERE!:)

Anwsers могут быть в простом SQL или с использованием php (и CodeIgniter) или иным способом. Я бы эту проблему решал любым возможным способом;)

Я действительно могу использовать совет/помощь!= D

4b9b3361

Ответ 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.