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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top