MySQL Обновление нескольких строк в одном столбце на основе значений из этого же столбца - PullRequest
7 голосов
/ 31 августа 2011

У меня есть таблица, которая выглядит следующим образом:

ID     Key     Value     Order
1      gender  m         0
2      gender  f         0

34     age     10        0
35     age     80        0

Чтобы обновить эти строки, я должен использовать следующее:

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'

Есть ли способ объединить это водно заявление об обновлении, без использования идентификатора (который не обязательно будет таким же), например (хотя это не сработает) ...

UPDATE `DemoGroup` 
SET `value`= CASE `value`
    WHEN 'm' THEN 'male',
    WHEN 'f' THEN 'female' END 
WHERE `value` = 'm' OR `value` = 'f'

Еще больше бонуса (но необязательно) это если бы я мог выяснить, как установить поле Order для каждой строки ...

Ответы [ 2 ]

14 голосов
/ 31 августа 2011

Вероятно, вам следует обновить значения, основываясь не только на значении value, но и на значении key, в противном случае вы можете обновить "m" до "male", когда ключ имеет значение "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');
0 голосов
/ 31 августа 2011

MySQL имеет функцию case.Попробуйте:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...