ACTUALIZAR varias filas con diferentes valores en una consulta en MySQL

Resuelto franvergara66 asked hace 10 años • 9 respuestas

Estoy tratando de entender cómo ACTUALIZAR varias filas con diferentes valores y simplemente no lo entiendo. La solución está en todas partes pero a mí me parece difícil de entender.

Por ejemplo, tres actualizaciones en 1 consulta:

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

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

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

Leí un ejemplo, pero realmente no entiendo como hacer la consulta. es decir:

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

No tengo del todo claro cómo hacer la consulta si hay varias condiciones en la condición WHERE y IF... ¿Alguna idea?

franvergara66 avatar Sep 05 '14 03:09 franvergara66
Aceptado

Puedes hacerlo de esta manera:

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';

No entiendo tu formato de fecha. Las fechas deben almacenarse en la base de datos utilizando tipos de fecha y hora nativos.

Gordon Linoff avatar Sep 04 '2014 20:09 Gordon Linoff

MySQL permite una forma más legible de combinar múltiples actualizaciones en una sola consulta. Esto parece adaptarse mejor al escenario que usted describe, es mucho más fácil de leer y evita esas múltiples condiciones difíciles de desenredar.

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

Esto supone que la user_rol, cod_officecombinación es una clave principal. Si solo uno de estos es la clave principal , agregue el otro campo a la lista ACTUALIZAR. Si ninguno de ellos es una clave principal (eso parece poco probable), entonces este enfoque siempre creará nuevos registros, probablemente no lo que se desea.

Sin embargo, este enfoque hace que las declaraciones preparadas sean más fáciles de elaborar y más concisas.

Trevedhek avatar Jan 19 '2016 00:01 Trevedhek