Подтвердить что ты не робот

MySQL - UPDATE несколько строк с разными значениями в одном запросе

Я пытаюсь понять, как ОБНОВИТЬ несколько строк с разными значениями, и я просто не понимаю. Решение повсюду, но для меня это трудно понять.

Например, три обновления в 1 запрос:

UPDATE table_users
SET cod_user = '622057'
    , date = '12082014'
WHERE user_rol = 'student'
    AND cod_office = '123456'; 

UPDATE table_users
SET cod_user = '2913659'
    , date = '12082014'
WHERE user_rol = 'assistant'
    AND cod_office = '123456'; 

UPDATE table_users
SET cod_user = '6160230'
    , date = '12082014'
WHERE user_rol = 'admin'
    AND cod_office = '123456'; 

I читает пример, но я действительно не понимаю, как сделать запрос. то есть:

UPDATE table_to_update
SET cod_user= IF(cod_office = '123456','622057','2913659','6160230')
    ,date = IF(cod_office = '123456','12082014')
WHERE ?? IN (??) ;

Я не совсем понимаю, как выполнить запрос, если в WHERE и в условии IF есть несколько условий: какие-то идеи?

4b9b3361

Ответ 1

Вы можете сделать это следующим образом:

UPDATE table_users
    SET cod_user = (case when user_role = 'student' then '622057'
                         when user_role = 'assistant' then '2913659'
                         when user_role = 'admin' then '6160230'
                    end),
        date = '12082014'
    WHERE user_role in ('student', 'assistant', 'admin') AND
          cod_office = '17389551';

Я не понимаю ваш формат даты. Даты должны храниться в базе данных с использованием собственных типов даты и времени.

Ответ 2

MySQL позволяет более читаемый способ объединить несколько обновлений в один запрос. Это, по-видимому, лучше соответствует сценарию, который вы описываете, гораздо легче читать и избегает трудных для распутывания множественных условий.

INSERT INTO table_users (cod_user, date, user_rol, cod_office)
VALUES
('622057', '12082014', 'student', '123456'),
('2913659', '12082014', 'assistant','123456'),
('6160230', '12082014', 'admin', '123456')
ON DUPLICATE KEY UPDATE
 cod_user=VALUES(cod_user), date=VALUES(date)

Предполагается, что комбинация user_rol, cod_office является первичным ключом. Если только один из них является PK, добавьте другое поле в список UPDATE. Если ни один из них не является первичным ключом (что кажется маловероятным), то этот подход всегда будет создавать новые записи - возможно, не то, что нужно.

Однако этот подход упрощает сбор и упрощение подготовленных инструкций.

Ответ 3

Вы можете использовать оператор CASE для обработки нескольких сценариев if/then:

UPDATE table_to_update 
SET  cod_user= CASE WHEN user_rol = 'student' THEN '622057'
                   WHEN user_rol = 'assistant' THEN '2913659'
                   WHEN user_rol = 'admin' THEN '6160230'
               END
    ,date = '12082014'
WHERE user_rol IN ('student','assistant','admin')
  AND cod_office = '17389551';

Ответ 4

update table_name
set cod_user = 
    CASE 
    WHEN user_rol = 'student' THEN '622057'
    WHEN user_rol = 'assistant' THEN '2913659'
    WHEN user_rol = 'admin' THEN '6160230'?
    END,date = '12082014'

WHERE user_rol IN ('student','assistant','admin')
AND cod_office = '17389551';