web-dev-qa-db-fra.com

Mettre à jour plusieurs lignes avec plusieurs clauses «where» pour chaque ligne individuelle

J'essaie de mettre à jour ma table comme ceci:

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

Je peux faire une foreach() mais cela enverra plus de 50 requêtes distinctes, ce qui est très lent. C'est pourquoi je veux qu'il soit combiné en 1 grande requête.

(J'utilise un id pour chaque ligne mais la combinaison de game_id , x et y est ce que j'utilise pour identifier la ligne dont j'ai besoin .)

La fonction update_batch () de codeIgniter décrite ici: Mettre à jour le lot avec CodeIgniter était utile et presque parfaite mais elle ne permet qu'une seule clause where, vous ne pouvez pas (pour autant que j'ai compris et essayé) entrer un tableau avec plusieurs clauses where.

J'ai également vérifié cette question: MYSQL UPDATE SET sur la même colonne mais avec plusieurs clauses WHERE Mais cela ne permet que des mises à jour de plusieurs lignes contenant uniquement une seule clause WHERE différente et j'ai besoin de plusieurs clauses WHERE! :)

Les réponses peuvent être en SQL simple ou avec l'utilisation de php (et CodeIgniter) ou d'une manière différente. J'aimerais que ce problème soit résolu de toutes les manières possibles;)

Je peux vraiment utiliser les conseils/l'aide! = D

21
Dex

essayez ceci en utilisant 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.
46
John Woo