2011-12-05 24 views
12

Me encuentro ante una situación compleja de consultas SQL. La tarea es actualizar varias filas, con múltiples valores y múltiples condiciones. A continuación está la información que quiero actualizar; campo para actualizar: 'ventas', campos de condición: 'campid' y 'fecha':Actualizar varias filas con múltiples valores y múltiples condiciones mysql

if campid = 259 and date = 22/6/2011 then set sales = $200 
else if campid = 259 and date = 21/6/2011 then set sales = $210 
else if campid = 260 and date = 22/6/2011 then set sales = $140 
else if campid = 260 and date = 21/6/2011 then set sales = $150 

Quiero actualizar todos estos en una sola consulta.

+0

votaron a favor para contrarrestar el downvote sin comentarios. Creo que esta es una pregunta legítima si alguien todavía no tiene conocimiento de las transacciones. –

Respuesta

19

Prueba esto:

UPDATE your_table SET sales = 
CASE 
    WHEN campid = 259 AND date = 22/6/2011 THEN 200 
    WHEN campid = 259 AND date = 21/6/2011 THEN 210 
    WHEN campid = 259 AND date = 22/6/2011 THEN 140 
    WHEN campid = 259 AND date = 21/6/2011 THEN 150 
    ELSE sales 
END 

Naturalmente no lo hago saber si el campo de fecha es realmente FECHA o FECHA HORA, así que dejé la consulta que muestra lo que puede hacer, pero tal vez tenga que arreglar la comparación de fechas de acuerdo con el tipo de datos. Si el campo de fecha es FECHA (como debería), puede escribir AND date = '2011-06-22' y así sucesivamente.
Nota ELSE condición: es necesario evitar los registros que no caigan dentro de otros casos se establecerán en NULL.

+0

Gracias Marco. –

+0

Utilicé este ejemplo en mi problema, funcionó. Después de mucho tiempo, llegué a la conclusión de que este tipo de consulta proporciona el mejor rendimiento en una pequeña cantidad de datos. En el caso de que la tabla tenga millones de registros, la actualización de un solo registro a la vez utilizando la clave primaria en el parámetro ahorra mucho tiempo, por lo tanto, produce un mejor rendimiento. –

+0

Gracias, salvé la noche –

1

No debes hacer esto en una sola consulta. En cambio, si lo que busca es actualizarlos atómicamente, todo al mismo tiempo, debe emitir varias declaraciones UPDATE en una sola transacción .

No dice qué versión de MySQL usa, y no qué motor de almacenamiento. Suponiendo InnoDB - que es el estándar en las versiones recientes de MySQL y por lo general se debe utilizar para los sistemas transaccionales - y también asumiendo que está haciendo esto desde el cliente de línea de comandos, lo haría

mysql> set autocommit=0; 
mysql> UPDATE ....; 
mysql> UPDATE ....; 
mysql> ... 
mysql> commit; 

Puede confirmación automática a continuación, volver a habilitar si como mediante la repetición de la primera línea, pero con un valor de 1:

mysql> set autocommit=1; 
+0

imo, eso no responde lo que OP pide – ajreal

+0

Humildemente estoy en desacuerdo. El constructo If-elseif-elseif etc. presentado en la pregunta, junto con la afirmación de que quiere actualizar los campos al mismo tiempo, es exactamente lo que haría mi respuesta. Por supuesto, hay otras maneras de hacer esto, también, si una declaración es realmente (!) Necesaria. –

+0

Daniel tiene razón. Estaba pidiendo condiciones múltiples para una ejecución determinada. –

1

En lugar de escribir una consulta sql que es demasiado complicada y complicada, creo que sería mejor que se pasara el tiempo escribiendo un objeto de acceso a datos para manejar estas manipulaciones bastante simples por registro. Esto hace que el mantenimiento posterior del código, junto con el desarrollo de un nuevo código usando sus objetos de acceso a datos, sea mucho más fácil que una consulta de sql intrincada y de uso único.

Cuestiones relacionadas