问题
I have a table that looks like the following:
ID Key Value Order
1 gender m 0
2 gender f 0
34 age 10 0
35 age 80 0
To update these rows I have to use the following:
UPDATE `DemoGroup` SET `value` = 'male' WHERE `value` = 'm'
UPDATE `DemoGroup` SET `value` = 'female' WHERE `value` = 'f'
UPDATE `DemoGroup` SET `value` = '10-19' WHERE `value` = '10'
UPDATE `DemoGroup` SET `value` = '80-89' WHERE `value` = '80'
Is there a way to consolidate this into one update statement, without using the ID (which is not guaranteed to be the same), such as (even though this won't work)...
UPDATE `DemoGroup`
SET `value`= CASE `value`
WHEN 'm' THEN 'male',
WHEN 'f' THEN 'female' END
WHERE `value` = 'm' OR `value` = 'f'
Even more of a bonus (but not nessesary) is if I could figure out how to set the Order field as well for each row...
回答1:
You should probably update the values based not only on the value of value but on the value of key, otherwise you could update 'm' to 'male' when key is 'shirt-size'.
UPDATE `DemoGroup`
SET `value` = CASE
WHEN (`key`, `value`) = ('gender', 'm') THEN 'male'
WHEN (`key`, `value`) = ('gender', 'f') THEN 'female'
WHEN (`key`, `value`) = ('age', '10') THEN '10-19'
WHEN (`key`, `value`) = ('age', '80') THEN '80-89'
ELSE `value` -- no-op for other values
END
WHERE `key` IN ('gender','age');
回答2:
MySQL does have a case function. Try:
UPDATE DemoGroup SET `value` =
CASE `value` WHEN 'm' THEN 'male'
WHEN 'f' THEN 'female'
WHEN '10' THEN '10-19'
WHEN '80' THEN '80-89' END;
来源:https://stackoverflow.com/questions/7261656/mysql-update-multiple-rows-on-a-single-column-based-on-values-from-that-same-col