Sql Datum wählen Zeilen innerhalb X Sekunden Reichweite voneinander
Frage
Meine SQL-Tabelle ist so etwas wie (Meldung, erstellt)
Ich möchte diese Zeilen auszuwählen, die innerhalb von X Sekunden voneinander entfernt sind. Sagen die letzte Nachricht ist innerhalb von X Sekunden von NOW (), dann sollte es ihn auszuwählen. Wenn die zweite letzte Meldung innerhalb von X Sekunden von der letzten Nachricht ist, dann sollte es es zu wählen. Mit anderen Worten: jede Zeile soll mit der nächsten Zeile und geprüft verglichen werden. Für die letzte Zeile sollte es mit sagen prüfen werden NOW (). Grundsätzlich mag ich die letzte Sitzung der Nachrichten (d letzten Satz von Nachrichten, die wir miteinander verbunden ist, unter der Annahme, dass consequtive Nachrichten innerhalb X Sekunden miteinander verbunden sind)
Ich habe keine Ahnung, wie man über das Schreiben einer SQL-Abfrage für diese gehen. Ist es überhaupt möglich?
Vielen Dank für Ihre Zeit.
Lösung
Dieses Skript arbeitet in SQLServer. Sie sollten die Select-Anweisung zu nehmen und führen Sie es in MySQL in der Lage sein.
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
Andere Tipps
Ich glaube, Sie denken zu kompliziert (Aber dann wieder, vielleicht falsch verstanden ich die Forderung?)
Damit werden alle Nachrichten innerhalb von 30 Sekunden, bevor eine bestimmte Nachricht erstellt:
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 Id Sie daran interessiert sind, und 30 ist die Anzahl der Sekunden in Ihrem Zeitrahmen.