Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: XafiloX en 10 Febrero 2011, 11:36 am



Título: DELETE de resultado de un SELECT
Publicado por: XafiloX en 10 Febrero 2011, 11:36 am
Hola! Escribo este tema por si me podéis decir si es posible hacer una consulta que sea un delete de los resultados (varias filas) de un select (todo en una sola consulta...).

Es decir, yo tengo estas dos consultas:

Código
  1. SELECT rid FROM web_messages WHERE `del_time` <= UNIX_TIMESTAMP() AND `message_type` = '3' AND `rid` != '0' GROUP BY `rid` ORDER BY `del_time` DESC
Y esta en un bucle que recorre todos los resultados de la anterior:
Código
  1. DELETE FROM web_reportes WHERE `rid` = 'cada_resultado_anterior' LIMIT 1;

Y me gustaría saber si hay alguna menra de unir las dos querys en 1 sola, funcionando con todos los resultados de la primera (no con uno solo).

Un saludo y gracias por la ayuda!


Título: Re: DELETE de resultado de un SELECT
Publicado por: Novlucker en 10 Febrero 2011, 12:59 pm
Código
  1. DELETE FROM web_reportes WHERE `rid` IN (SELECT DISTINCT rid FROM web_messages WHERE `del_time` <= UNIX_TIMESTAMP() AND `message_type` = '3' AND `rid` != '0');

Tampoco necesitas el GROUP y ORDER

Saludos


Título: Re: DELETE de resultado de un SELECT
Publicado por: XafiloX en 11 Febrero 2011, 08:57 am
Ah,muchísimas gracias,luego cuando llegue a mi casa lo pruebo,que ahora estoy en la facultad...lo del group y el orden by si los necesita porque en la misma tabla siempre hay varias filas con el mismo rid...


Título: Re: DELETE de resultado de un SELECT
Publicado por: .mokk. en 11 Febrero 2011, 09:45 am
pero eso es solo para ordenar que no? y si vas a eliminar todo eso am creo que seria demas en el code


Título: Re: DELETE de resultado de un SELECT
Publicado por: XafiloX en 11 Febrero 2011, 18:21 pm
Ah, ya, ya veo lo que decís...pensaba que con ese order by conseguiría agrupar de manera que me cogiese siempre el mayor valor de del_time, pero ya veo que no es así, que lo que hace es darme el resultado ordenado...

En verdad yo lo que quiero es que, a partir de una tabla en la que suele haber varias filas con un mismo rid y distintos del_time, obtener el rid solo de aquellas filas cuyo mayor del_time (de entre todas las que comparten el rid) sea menor que el tiempo actual, y esa lista de rids utilizarla para borrar los elementos que tengan ese rid en otra tabla...

Vamos, que si yo tengo una tabla que tiene (entre otras cosas) lo siguiente:

riddel_time
cf5b1f86eb50f1f39835854119dc5c1c1297437046
cf5b1f86eb50f1f39835854119dc5c1c1297440385
050c168ddc6c20dba9612144c68079061297435430
050c168ddc6c20dba9612144c68079061297435430
y el timestamp actual es 1297438046, tendría que seleccionar (y borrar) las que tengan rid 050c168ddc6c20dba9612144c6807906, ya que en el caso del otro rid, 1297437046 si es menor que el timestamp, pero 1297440385 no...

Entonces, la que query que he escrito la tengo por ahora así (aplicando ya lo del delete de novlucker):
Código
  1. DELETE FROM web_reportes WHERE `rid` IN (SELECT rid FROM(SELECT rid, MAX(del_time) AS max_del_time FROM web_messages WHERE message_type = '3' AND rid != '0' GROUP BY rid)sub WHERE sub.max_del_time <= UNIX_TIMESTAMP())

¿Consideráis que así está bien?¿Se os ocurre alguna posible optimización?

Gracias por la ayuda