2009-05-08 3 views
4

My SQL-Tabelle ist so etwas wie (Nachricht, erstellt)Sql Datum wählen Zeilen innerhalb X Sekunden Reichweite voneinander

ich diese Zeilen auswählen möchten, die voneinander innerhalb X Sekunden sind. Sagen Sie die letzte Nachricht ist innerhalb von X Sekunden von NOW(), dann sollte es auswählen. Wenn die zweitletzte Nachricht innerhalb von X Sekunden von der letzten Nachricht entfernt ist, sollte sie diese ebenfalls auswählen. Mit anderen Worten, jede Zeile sollte mit der nächsten Zeile verglichen und überprüft werden. Für die letzte Zeile sollte es mit say NOW() überprüft werden. Grundsätzlich möchte ich die letzte Sitzung von Nachrichten (dh letzten Satz von Nachrichten, die wir miteinander verbunden sind, vorausgesetzt, dass aufeinanderfolgende Nachrichten innerhalb von X Sekunden miteinander verknüpft sind)

Ich habe keine Ahnung, wie man eine SQL-Abfrage schreibt dafür. Ist es überhaupt möglich?

Vielen Dank für Ihre Zeit.

Antwort

3

Dieses Skript funktioniert in SQLServer. Sie sollten in der Lage sein, die select-Anweisung herauszunehmen und sie in MySQL auszuführen.

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

können Sie mir das bitte erklären? genau was macht jeder Teil der Join? –

+0

gab mir einen Anfang. Ich habe es mir gedacht. Danke für den Tipp. –

+0

@Alec Smart, nicht erwähnen. Froh, dass du es herausgefunden hast, ich habe bereits versucht, den Beitritt zu erklären, aber es hat mir schwer gefallen. (Englisch ist nicht meine Muttersprache) –

0

Ich glaube, Sie denken zu kompliziert

Diese alle Nachrichten innerhalb von 30 Sekunden, bevor eine bestimmte Nachricht erstellt wählt (Aber dann wieder, vielleicht falsch verstanden ich die Forderung?):

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

wo 17 ist natürlich die Nachricht, die Sie interessiert, und 30 ist die Anzahl der Sekunden in Ihrem Zeitrahmen.

+0

sollte es 30 Sekunden ineinander sein ... nicht w.r.t zu einer einzigen Nachricht. –

+0

Wie stellen Sie sich das Ergebnis vor? Wie würde "SELECT * FROM Nachrichten WHERE {sie sind 30 Sekunden voneinander}" aussehen? – Tomalak