Pregunta

Mi tabla sql es algo así como (mensaje, creado)

Quiero seleccionar esas filas que están dentro de X segundos entre sí. Digamos que el último mensaje está dentro de X segundos desde AHORA (), luego debería seleccionarlo. Si el segundo último mensaje está dentro de X segundos desde el último mensaje, entonces también debería seleccionarlo. En otras palabras, cada fila debe compararse con la siguiente fila y comprobarse. Para la última fila se debe verificar con say NOW (). Básicamente quiero la última sesión de mensajes (es decir, el último conjunto de mensajes que vinculamos entre sí, suponiendo que los mensajes consecutivos dentro de X segundos estén vinculados entre sí)

No tengo idea de cómo escribir una consulta SQL para esto. ¿Es posible?

Muchas gracias por su tiempo.

¿Fue útil?

Solución

Este script funciona en SQLServer. Debería poder sacar la instrucción select y ejecutarla en MySQL.

DECLARE @Messages TABLE (Message VARCHAR(10), Created DATETIME)
DECLARE @Interval FLOAT

-- Interval is 1 day.
SET @Interval = 1

-- These should be in result
INSERT INTO @Messages VALUES ('Message1', GetDate())    
INSERT INTO @Messages VALUES ('Message2', GetDate()-1)
-- These should not be in result
INSERT INTO @Messages VALUES ('Message3', GetDate()-3)
INSERT INTO @Messages VALUES ('Message4', GetDate()-5)

SELECT m1.Message, m1.Created
FROM @Messages m1
     INNER JOIN @Messages m2 ON m2.Created <= m1.Created + @Interval                                
                                AND m2.Created >= m1.Created
                                AND m2.Message <> m1.Message
UNION ALL SELECT m2.Message, m2.Created
FROM @Messages m1
     INNER JOIN @Messages m2 ON m2.Created <= m1.Created + @Interval                                
                                AND m2.Created >= m1.Created
                                AND m2.Message <> m1.Message
ORDER BY Created

Otros consejos

Creo que estás pensando demasiado complicado (Pero, de nuevo, ¿tal vez entendí mal el requisito?)

Esto selecciona todos los mensajes creados dentro de los 30 segundos anteriores a un mensaje en particular:

SELECT
  Id,
  MessageText,
  MessageDate
FROM
  Message
WHERE
  TIME_TO_SEC(TIMEDIFF(
    (
      SELECT MessageDate 
      FROM   Message
      WHERE  Id = 17
    ),
    MessageDate
  )) <= 30

donde 17 es, por supuesto, la identificación del mensaje que le interesa, y 30 es el número de segundos en su marco de tiempo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top