Question

Ma table SQL ressemble à quelque chose comme (message, créé)

Je souhaite sélectionner les lignes qui se trouvent à moins de X secondes les unes des autres. Disons que le dernier message est dans les X secondes de NOW (), alors il devrait le sélectionner. Si le dernier dernier message est dans les X secondes du dernier message, il doit également le sélectionner. En d'autres termes, chaque ligne doit être comparée à la suivante et cochée. Pour la dernière ligne, vérifiez avec say NOW (). Fondamentalement, je veux la dernière session de messages (c'est-à-dire le dernier ensemble de messages que nous avons liés les uns aux autres, en supposant que les messages consécutifs dans un délai de X secondes soient liés les uns aux autres)

Je ne sais pas comment écrire une requête SQL pour cela. Est-ce même possible?

Merci beaucoup pour votre temps.

Était-ce utile?

La solution

Ce script fonctionne sur SQLServer. Vous devriez pouvoir extraire l’instruction select et l’exécuter dans 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

Autres conseils

Je pense que vous pensez trop compliqué (Mais encore une fois, j'ai peut-être mal compris l'exigence?)

Ceci sélectionne tous les messages créés dans les 30 secondes précédant un message particulier:

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

où 17 correspond bien entendu à l'identifiant du message qui vous intéresse et à 30 correspondant au nombre de secondes de votre plage horaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top