2012-07-13 25 views
9

Estoy tratando de combinar estas dos consultas en Python trenzado:MySQL: filas actualizada de retorno

SELECT * FROM table WHERE group_id = 1013 and time > 100; 

y:

UPDATE table SET time = 0 WHERE group_id = 1013 and time > 100 

en una sola consulta. ¿Es posible hacerlo?

Intenté poner el SELECT en una consulta secundaria, pero no creo que toda la consulta me devuelva lo que quiero.

¿Hay alguna manera de hacerlo? (aún mejor, sin una consulta secundaria) ¿O solo tengo que seguir con dos consultas?

Gracias,

Quan

+2

Estos son conceptualmente dos acciones diferentes ¿Qué estás tratando de ganar combinándolos de alguna manera? – Wiseguy

+0

Estoy tratando de hacer mi consulta lo más rápido posible, ya que manejará cargas pesadas. –

+1

Bueno, no puedes combinar estas consultas. Para optimizar la velocidad, asegúrese de indexar sus tablas correctamente. ['EXPLAIN'] (http://dev.mysql.com/doc/refman/5.5/en/using-explain.html) te ayudará a informarte sobre las cosas que deben optimizarse. – Wiseguy

Respuesta

3

No puede combinar estas consultas directamente. Pero puede escribir un procedimiento almacenado que ejecute ambas consultas. ejemplo:

delimiter | 
create procedure upd_select(IN group INT, IN time INT) 
begin 
    UPDATE table SET time = 0 WHERE group_id = @group and time > @time; 
    SELECT * FROM table WHERE group_id = @group and time > @time; 
end; 
| 
delimiter ; 
+3

Después de ACTUALIZAR, las filas que Squall Leohart quieren devolver tienen tiempo = 0, por lo que el SELECCIONAR con tiempo de condición> @time no funcionará como se esperaba. – md2perpe

5

Al parecer MySQL tiene algo que podría ser de utilidad, especialmente si sólo está actualizando una fila.

Este ejemplo es de: http://lists.mysql.com/mysql/219882

UPDATE mytable SET 
mycolumn = @mycolumn := mycolumn + 1 
WHERE mykey = 'dante'; 

SELECT @mycolumn; 

nunca he probado esto, sin embargo, pero no quiero saber cómo le va.

+0

gracias, pero quiero devolver varias filas –

2

Así que lo que estamos tratando de hacer es time de reposición a cero cada vez que se accede a una fila - como una especie de gatillo, pero MySQL no se puede hacer después de disparadores SELECT.

Probablemente la mejor manera de hacerlo con una solicitud de servidor desde la aplicación es escribir un procedimiento almacenado que actualice y luego devuelva la fila. Si es muy importante que los dos ocurran juntos, envuelva las dos declaraciones en una transacción.

1

Hay una versión más rápida de la devolución de registros actualizados, y más correcta cuando se trata de sistemas muy cargados pide la ejecución de la consulta al mismo tiempo en el mismo servidor de base de datos

update table_name WITH (UPDLOCK, READPAST) 
SET state = 1 
OUTPUT inserted. 
+1

Creo que esto solo funciona en MS SQL. La publicación fue en lo que respecta a MySQL. – PromInc