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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top