2012-02-20 25 views
10

Với MYSQL Tôi đang sử dụng truy vấn này:MYSQL UPDATE Set trên cùng một cột nhưng với nhiều ĐÂU khoản

UPDATE CustomerDetails_COPY 
SET Category_ID = 10 
WHERE Category_ID = 2 

Thats tốt nhưng tôi muốn quảng cáo 15+ hơn SET/WHERE để nó thích:

UPDATE CustomerDetails_COPY 
SET Category_ID = 9 WHERE Category_ID = 3 
SET Category_ID = 12 WHERE Category_ID = 4 
SET Category_ID = 11 WHERE Category_ID = 5 
..... 

Tôi làm cách nào để thêm điều này?

EDIT:

Như mỗi Hunters Góp ý:

UPDATE CustomerDetails_COPY 
    SET Category_ID = CASE Category_ID 
     WHEN 2 THEN 10 
     WHEN 3 THEN 9 
     WHEN 4 THEN 12 
     WHEN 5 THEN 11 
    END 
WHERE Category_ID IN (2,3,4,5) 

này hoạt động tuyệt vời! Cảm ơn

Trả lời

13

Something như thế này nên làm việc cho bạn:

UPDATE CustomerDetails_COPY 
    SET Category_ID = CASE Category_ID 
     WHEN 2 THEN 10 
     WHEN 3 THEN 9 
     WHEN 4 THEN 12 
     WHEN 5 THEN 11 
    END 
WHERE Category_ID IN (2,3,4,5) 

Ngoài ra, như Simon gợi ý, bạn có thể làm điều này để tiết kiệm từ nhập các giá trị gấp đôi:

UPDATE CustomerDetails_COPY 
    SET Category_ID = CASE Category_ID 
     WHEN 2 THEN 10 
     WHEN 3 THEN 9 
     WHEN 4 THEN 12 
     WHEN 5 THEN 11 
     ELSE Category_ID 
    END 

Nguồn: http://www.karlrixon.co.uk/writing/update-multiple-rows-with-different-values-and-a-single-sql-query/

+1

Đã xóa nhận xét của tôi là đã cố gắng và làm việc này, tốt đẹp :) Như một lưu ý, bạn có thể thêm "ELSE Category_ID" trước "END" nếu bạn không muốn bao gồm WHERE –

+0

Cảm ơn. Một điểm tốt; nó sẽ tiết kiệm từ việc nhập các cột hai lần. –

+2

Với mệnh đề 'WHERE', bạn được đảm bảo khá nhiều để có thể sử dụng một chỉ mục trên Category_ID, cũng với [safe-updates] (http://dev.mysql.com/doc/refman/5.0/en/ mysql-command-options.html # option_mysql_safe-updates) được bật, bạn phải nhập mệnh đề 'WHERE' với' UPDATE', vì vậy mệnh đề 'ELSE' có thể không phải là lựa chọn tốt nhất. Gắn bó với 'WHERE'. –

2

Cách thông thường để làm điều này sẽ

UPDATE CustomerDetails_COPY SET Category_ID = 10 WHERE Category_ID = 2 
UPDATE CustomerDetails_COPY SET Category_ID = 9 WHERE Category_ID = 3 
UPDATE CustomerDetails_COPY SET Category_ID = 12 WHERE Category_ID = 4 
UPDATE CustomerDetails_COPY SET Category_ID = 11 WHERE Category_ID = 5 

Có bất kỳ lý do bạn đang tránh phương pháp này?

Có sự tương quan nào giữa giá trị mới và cũ của category_ID không?

+0

tôi có hơn 300 loại khác nhau :( – Monty

+0

Tại sao điều đó có thay đổi gì không? Đây là một truy vấn tắt, phải không? Vì vậy, hãy sử dụng tính năng sao chép/dán của máy tính của bạn và tạo một ngày trong đó. Trừ khi tất nhiên giá trị MỚI của bất kỳ xung đột nào trong số này xung đột với giá trị OLD của một số. Sau đó, bạn có thể cần một bảng tạm thời hoặc giải pháp của Hunter – JohnFx

+0

Hầu hết đều khác nhau nhưng một số thì giống nhau. – Monty

1

bạn có thể tạo một bảng khác nơi ánh xạ được tạo .. như:

map_table 
----------- 
mani_id 
new_id 

sau đó điền nó trong ...

sau đó

UPDATE CustomerDetails_Copy set category_id = (select new_id from map_table where mani_id = category_id) 
Các vấn đề liên quan