data SQL SELECT linhas dentro X segundos alcance um do outro
Pergunta
A minha mesa sql é algo como (mensagem, criado)
Eu quero selecionar as linhas que estão dentro de X segundos um do outro. Diga a última mensagem está dentro de X segundos a partir de agora (), então ele deve selecioná-lo. Se o segundo última mensagem está dentro de X segundos da última mensagem, então ele deve selecioná-lo também. Em outras palavras, cada linha deve ser comparado com a próxima linha e verificado. Para a última linha deve ser cheque com digamos NOW (). Basicamente eu quero a última sessão de mensagens (ou seja, último conjunto de mensagens que nós ligados uns aos outros, assumindo que as mensagens consequtive dentro de X segundos são ligados uns aos outros)
Eu não tenho nenhuma idéia de como ir sobre como escrever uma consulta SQL para isso. Será que é mesmo possível?
Muito obrigado pelo seu tempo.
Solução
Este script funciona em SQLServer. Você deve ser capaz de tirar a instrução select e executá-lo no 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
Outras dicas
Eu acredito que você está pensando muito complicado (Mas, novamente, talvez eu não entendi essa exigência?)
Isso seleciona todas as mensagens criadas dentro de 30 segundos antes de uma determinada mensagem:
SELECT
Id,
MessageText,
MessageDate
FROM
Message
WHERE
TIME_TO_SEC(TIMEDIFF(
(
SELECT MessageDate
FROM Message
WHERE Id = 17
),
MessageDate
)) <= 30
onde 17 é, naturalmente, a mensagem Id você está interessado, e 30 é o número de segundos em sua estrutura de tempo.