Ver Mensaje Individual
  #3 (permalink)  
Antiguo 15/01/2009, 07:49
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta MySQL

El caso es complicado y requiere sentencias anidadas de varios niveles. si no quieres resolverlo por medio de un store procedure.
Primero tienes que lograr agrupar los registros de inicio y fin del cálculo, es decir, un mismo registro conteniendo el horario anterior y el siguiente de conexion, de modo que se agrupen uno a uno:
Código sql:
Ver original
  1. SELECT
  2.     ORIGEN, DESTINO, PORIG, PDEST, SID, INI, FIN
  3.   FROM
  4.     (SELECT
  5.       IP_origen ORIGEN,
  6.       IP_destino DESTINO,
  7.       s1.puerto_o PORIG,
  8.       s1.puerto_d PDEST,
  9.       sid SID,
  10.       s1.hora INI
  11.       s2.hora FIN
  12. FROM  tu_tabla s1 INNER JOIN tu_tabla s2
  13.       USING (IP_origen, IP_destino, sid)
  14. WHERE s1.hora<s2.hora AND s1.sid=3
  15. ORDER BY  s1.IP_origen, s2.hora ASC) T1
  16. GROUP BY ORIGEN, SID, FIN;
El agrupamiento hace desaparecer los registros no validos.

Luego hay que hacer el verdadero cálculo, es decir, que te devuelva los datos de los registros cuya diferencia de tiempos es de cinco minutos, y que además se hayan hecho al menos cuatro intentos:
Código sql:
Ver original
  1. SELECT ORIGEN, PORIG, PDEST, SID
  2. FROM (
  3.   SELECT
  4.     ORIGEN, DESTINO, PORIG, PDEST, SID, INI, FIN
  5.   FROM
  6.     (SELECT
  7.       IP_origen ORIGEN,
  8.       IP_destino DESTINO,
  9.       s1.puerto_o PORIG,
  10.       s1.puerto_d PDEST,
  11.       sid SID,
  12.       s1.hora INI
  13.       s2.hora FIN
  14.     FROM  tu_tabla s1 INNER JOIN tu_tabla s2
  15.       USING (IP_origen, IP_destino, sid)
  16.     WHERE s1.hora<s2.hora AND s1.sid=3
  17.     ORDER BY  s1.IP_origen, s2.hora ASC) T1
  18.   GROUP BY ORIGEN, SID, FIN) T2
  19. WHERE MINUTE(TIMEDIFF(INI,FIN))>=5
  20. GROUP BY ORIGEN
  21. HAVING COUNT(*)>=4;

Aclaro que lo estoy reconstruyendo sobre la base de casos que he programado antes, pero que de todos modos hay que ir probando las selecciones de a una, desde adentro hacia afuera.
Como no tengo los datos ni la estructura, no he podido comprobarlo, pero el esquema es esencialmente correcto. Si hay errores estarán en los ordenamientos intermedios o los campos de agrupación.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)