Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Trigger - sprawdzanie poprzednich wierszy
Forum PHP.pl > Forum > Bazy danych > MySQL
Azek
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;
trueblue
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).
Azek
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.