Trigger - sprawdzanie poprzednich wierszy |
Trigger - sprawdzanie poprzednich wierszy |
21.01.2019, 23:17:11
Post
#1
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 3 Dołączył: 28.12.2011 Ostrzeżenie: (0%) |
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; Ten post edytował Azek 21.01.2019, 23:19:28 |
|
|
Wersja Lo-Fi | Aktualny czas: 18.04.2024 - 02:21 |