Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Trigger - sprawdzanie poprzednich wierszy
Azek
post 21.01.2019, 23:17:11
Post #1





Grupa: Zarejestrowani
Postów: 52
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
Go to the top of the page
+Quote Post
trueblue
post 22.01.2019, 07:53:50
Post #2





Grupa: Zarejestrowani
Postów: 5 500
Pomógł: 1503
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).


--------------------
Go to the top of the page
+Quote Post
Azek
post 22.01.2019, 12:30:56
Post #3





Grupa: Zarejestrowani
Postów: 52
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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 22.09.2019 - 20:25