Domanda

La mia tabella sql è qualcosa di simile (messaggio, creato)

Voglio selezionare quelle righe che si trovano entro X secondi l'una dall'altra. Supponiamo che l'ultimo messaggio sia entro X secondi da NOW (), quindi dovrebbe selezionarlo. Se il secondo ultimo messaggio si trova entro X secondi dall'ultimo messaggio, dovrebbe selezionarlo anche. In altre parole, ogni riga deve essere confrontata con la riga successiva e verificata. Per l'ultima riga dovrebbe essere verificato con dire ORA (). Fondamentalmente voglio l'ultima sessione di messaggi (ovvero l'ultima serie di messaggi che abbiamo collegato tra loro, supponendo che i messaggi consequtivi entro X secondi siano collegati tra loro)

Non ho idea di come scrivere una query SQL per questo. È anche possibile?

Grazie mille per il tuo tempo.

È stato utile?

Soluzione

Questo script funziona in SQLServer. Dovresti essere in grado di estrarre l'istruzione select ed eseguirla in 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

Altri suggerimenti

Credo che tu stia pensando troppo complicato (Ma poi di nuovo, forse ho frainteso il requisito?)

Seleziona tutti i messaggi creati entro 30 secondi prima di un determinato messaggio:

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

dove 17 è ovviamente il messaggio ID che ti interessa e 30 è il numero di secondi nel tuo intervallo di tempo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top