2013-03-11 8 views
16

próbuję zaktualizować tabelę tak:Aktualizuj wiele wierszy z wieloma „gdzie” klauzul dla każdego rzędu

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 

mogę zrobić foreach() ale wyśle ​​ponad 50 oddzielnych zapytań, który jest bardzo powolny . Dlatego chcę, aby był on połączony w 1 dużą kwerendę.

(I należy używać id dla każdego rzędu, ale kombinacja game_id, x i Y jest to, co przy identyfikacji wiersz muszę).

The update_batch() funkcja opisana tutaj przez kodIgniter: Update batch with CodeIgniter była pomocna i prawie idealna, ale dopuszcza tylko jedną pojedynczą klauzulę where, nie można (o ile zrozumiałem i wypróbowałem) wprowadzić tablicę z wieloma klauzulami where.

Ja również wyrejestrowany to pytanie: MYSQL UPDATE SET on the Same Column but with multiple WHERE Clauses ale pozwala tylko na wielu aktualizacji wierszy zawierających tylko jeden inny WHERE i muszę kilka WHERE! :)

Anwsers może być w prostym SQL lub przy użyciu php (i CodeIgniter) lub w inny sposób. Chciałbym rozwiązać ten problem w jakikolwiek możliwy sposób;)

Naprawdę mogę skorzystać z porady/pomocy! = D

Odpowiedz

39

spróbuj tego za pomocą 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

dziękuję! Pójdę i wypróbuję to teraz! – Dex

+0

Pamiętaj, aby najpierw wykonać kopię zapasową bazy danych ': D' –

+1

To zadziałało dzięki, jesteś moim bohaterem! =) – Dex