2013-03-11 28 views
16

Tôi cố gắng để cập nhật bảng của tôi như thế này:Cập nhật nhiều hàng với nhiều mệnh đề 'nơi' cho mỗi hàng cá nhân

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 

tôi có thể làm một foreach() nhưng điều đó sẽ gửi qua 50 truy vấn riêng biệt mà là rất chậm . Đó là lý do tại sao tôi muốn nó được kết hợp thành 1 Truy vấn lớn.

(Tôi sử dụng một id cho mỗi hàng, nhưng sự kết hợp của game_id, xy là những gì tôi sử dụng để xác định hàng tôi cần.)

Các update_batch() chức năng từ codeIgniter được mô tả ở đây: Update batch with CodeIgniter là hữu ích và gần như hoàn hảo nhưng nó chỉ cho phép 1 mệnh đề where, bạn không thể (theo như tôi hiểu và cố gắng) nhập một mảng với nhiều mệnh đề.

Tôi cũng đã xem câu hỏi này: MYSQL UPDATE SET on the Same Column but with multiple WHERE Clauses Nhưng nó chỉ cho phép cập nhật nhiều hàng chỉ chứa một mệnh đề WHERE khác nhau và tôi cần nhiều mệnh đề WHERE! :)

Anwsers có thể bằng SQL đơn giản hoặc với việc sử dụng php (và CodeIgniter) hoặc theo một cách khác. Tôi muốn vấn đề này được giải quyết theo bất kỳ cách nào có thể;)

Tôi thực sự có thể sử dụng lời khuyên/trợ giúp! = D

Trả lời

39

cung cấp cho một thử này bằng cách sử dụng 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

Cảm ơn bạn! Tôi sẽ đi và thử nó ngay bây giờ! – Dex

+0

hãy nhớ sao lưu cơ sở dữ liệu của bạn trước tiên ': D' –

+1

Cảm ơn bạn, bạn là người hùng của tôi! =) – Dex

Các vấn đề liên quan