Mam nieskomplikowaną tabelę na wiadomości:
id| data | user | message
1 | 2019-01-10 11:45:21 | Alice | Czesc wszystkim
2 | 2019-01-10 11:58:21 | Bob | Czesc, Alicja. Jak leci?
3 | 2019-01-10 11:58:40 | Bob | Co robisz?
4 | 2019-01-10 11:58:56 | Alice | Ucze sie
5 | 2019-01-10 13:12:49 | Dany | Hej, jestescie?
6 | 2019-01-10 13:54:06 | Alice | Siema
Chciałbym zrobić wyzwalacz, który po dodaniu wiersza sprawdzi czy ktoś już wcześniej pisał, i jeśli różnica czasu pomiędzy ostatnimi wiadomościami jest mniejsza niż 10 sekund, skleiłby obie.
Przykład: dodaję nowy wiersz
7 | 2019-01-10 13:54:08 | Alice | Ja już jestem
Po dodaniu powinno:
1) Pobrać ostatnie dwie wiadomości od Alice
2) Sprawdzić różnicę dat
3) Jeśli różnica mniejsza niż 10 sekund, zaktualizować ostatni wiesz doklejając wiadomość z poprzedniego, a poprzedni usunąć.
Po wykonaniu tabela powinna wyglądać tak:
id| data | user | message
....
5 | 2019-01-10 13:12:49 | Dany | Hej, jestescie?
7 | 2019-01-10 13:54:08 | Alice | Siema\nJa już jestem
Znalazłem kod, który mógłby mi pomóc, ale prawdę mówiąc nie wiem jak wykonać punkt 2) Czy ktoś mógłby pomóc?
CREATE PROCEDURE kurs1 ()
BEGIN
/* Najpierw deklarujemy zmienne */
DECLARE koniec, j SMALLINT UNSIGNED; /* zmienna koniec ma wartosc NULL */
DECLARE suma, z FLOAT DEFAULT 0.0;
/* Potem deklarujemy kursor */
/* Zapytanie SELECT może być bardzo skomplikowane */
DECLARE k1 CURSOR FOR SELECT I, X FROM przebieg ORDER BY I;
/* Co zrobić gdy dojdziemy do ostatniego wiersza */
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET koniec = 1;
/* Zakładamy tabelę tymczasową */
DROP TEMPORARY TABLE IF EXISTS RunningTotal;
CREATE TEMPORARY TABLE RunningTotal
(I SMALLINT UNSIGNED NOT NULL PRIMARY KEY,
X FLOAT, SumaNarastajaca FLOAT);
/* Otwieramy kursor */
OPEN k1;
/* Pętla wiersz po wierszu */
petla: LOOP
/* pobranie danych do kursora */
FETCH k1 INTO j, z;
/* wyjdź jeśli już skończyły się wiersze */
IF koniec = 1 THEN
LEAVE petla;
END IF;
/* oblicz i wstaw dane do tabeli tymczasowej */
SET suma = suma + z;
INSERT INTO RunningTotal VALUES (j,z,suma);
END LOOP petla;
/* koniec pętli po wierszach */
END;