MySQL – ATUALIZAR várias linhas com valores diferentes em uma consulta

Eu estou tentando entender como atualizar várias linhas com valores diferentes e eu simplesmente não entendo. A solução está em toda parte, mas para mim parece difícil de entender.

Por exemplo, três atualizações em uma consulta:

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

Eu li um exemplo, mas eu realmente não entendo como fazer a consulta. ie:

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

Eu não estou totalmente claro como fazer a consulta se houver várias condições no WHERE e na condição IF .. algumas idéias?

Você pode fazer assim:

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

Eu não entendo o seu formato de data. As datas devem ser armazenadas no database usando tipos de data e hora nativos.

O MySQL permite uma maneira mais legível de combinar várias atualizações em uma única consulta. Isso parece se encheckboxr melhor no cenário que você descreve, é muito mais fácil de ler e evita essas condições múltiplas difíceis de desvendar.

 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) 

Isso pressupõe que a combinação user_rol, cod_office é uma chave primária. Se apenas um deles for o PK, adicione o outro campo à lista UPDATE. Se nenhuma delas é uma chave primária (que parece improvável), essa abordagem sempre criará novos registros – provavelmente não o que é desejado.

No entanto, esta abordagem torna as declarações preparadas mais fáceis de construir e mais concisas.

Você pode usar uma instrução CASE para manipular vários cenários se / então:

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