2009-05-08 5 views
4

Ma table sql est quelque chose comme (message, créé)Date Sql sélectionner des lignes dans X secondes plage de l'autre

Je veux sélectionner les lignes qui sont dans X secondes de l'autre. Dites que le dernier message est dans X secondes de NOW(), alors il devrait le sélectionner. Si le second dernier message est dans les X secondes du dernier message, il doit également le sélectionner. En d'autres termes, chaque rangée doit être comparée à la rangée suivante et vérifiée. Pour la dernière rangée, il faut vérifier avec say NOW(). Fondamentalement, je veux la dernière session de messages (ie le dernier ensemble de messages que nous avons liés les uns aux autres, en supposant que les messages consécutifs dans X secondes sont liés les uns aux autres)

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

Merci beaucoup pour votre temps.

Répondre

3

Ce script fonctionne dans SQL Server. Vous devriez pouvoir sortir 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 
+0

pouvez-vous s'il vous plaît m'expliquer cela? exactement ce que fait chaque partie de la jointure? –

+0

m'a donné un début. Je l'ai compris. Merci pour le conseil. –

+0

@Alec Smart, ne le mentionnez pas. Je suis content que vous l'ayez compris, j'essayais déjà d'expliquer la jointure, mais j'ai eu du mal avec ça. (L'anglais n'étant pas ma langue maternelle) –

0

Je crois que vous pensez trop compliqué

Ceci permet de sélectionner tous les messages créés dans les 30 secondes avant un message particulier (Mais là encore, peut-être je mal compris l'exigence?):

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

où 17 est bien sûr le message Id qui vous intéresse, et 30 est le nombre de secondes dans votre tranche de temps.

+0

il devrait être 30 secondes l'un dans l'autre ... pas à un seul message. –

+0

Comment envisagez-vous le résultat? Comment serait "SELECT * FROM Messages O WH {ils sont à 30 secondes l'un de l'autre}"? – Tomalak

Questions connexes