2013-03-11 15 views
16

Sto cercando di aggiornare il mio tabella come questa:aggiornamento più righe con più 'dove' clausole di ogni singola riga

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 

posso fare un foreach() ma che invierà oltre 50 query separate che è molto lenta . Ecco perché voglio che sia combinato in 1 grande Query.

(io uso un id per ogni riga, ma la combinazione di game_id, x e y è quello che uso per identificare la riga ho bisogno.)

L'update_batch() funzione da codeIgniter descritto qui: Update batch with CodeIgniter è stato utile e quasi perfetto ma consente solo 1 clausola single where, non è possibile (per quanto ho capito e provato) immettere un array con più clausole where.

Ho anche controllato fuori questa domanda: MYSQL UPDATE SET on the Same Column but with multiple WHERE Clauses ma consente solo per gli aggiornamenti delle righe multiple che contengono solo una singola diversa clausola WHERE e ho bisogno di più clausole WHERE! :)

Anwsers può essere in SQL semplice o con l'uso di php (e CodeIgniter) o in un modo diverso. Vorrei risolvere questo problema in ogni modo possibile;)

Posso davvero usare il consiglio/aiuto! = D

risposta

39

dare una prova utilizzando 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. 
+0

Grazie! Vado e provalo ora! – Dex

+0

assicurati di eseguire prima il backup del tuo database ': D' –

+1

Ha funzionato grazie, sei il mio eroe! =) – Dex

Problemi correlati