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 |
|
|
22.01.2019, 07:53:50
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 761 Pomógł: 1822 Dołączył: 11.03.2014 Ostrzeżenie: (0%) |
A dlaczego chcesz sklejać wiadomości? Jeśli chcesz wyświetlić najświeższy wątek rozmowy, to nie musisz sklejać, bo wyciągniesz poszczególne wypowiedzi poprzez warunek WHERE (taki sam gdybyś chciał wyciągnąć cały sklejony wątek).
-------------------- |
|
|
22.01.2019, 12:30:56
Post
#3
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 3 Dołączył: 28.12.2011 Ostrzeżenie: (0%) |
Problem stanowi niezależny ode mnie system, który zapisuje wiadomości w bazie w 160-cioznakowych kawalkach (brama sms). Dodatkowo wyświetlane są w odwrotnej kolejności (wymóg odbiorcy) Jeśli przyjdzie taka wiadomość w dwóch częściach i najpierw wyświetla drugą, a potem pierwszą (uciętą), robi się niezly bałagan.
Zrobiłem już tymczasowo w PHP, ale takie rozwiązanie ma kilka niedogodności, więc chcę tę część przerzucić do MYSQL |
|
|
Wersja Lo-Fi | Aktualny czas: 23.04.2024 - 22:43 |