Witam,

Siedzialem ostatnio nad skrzynka wiadomosci. Chcialem zrobic cos podobnego do FB, ale natrafilem na problem.


Jak wiemy na FB wiadomosci dzialaja w nastepujacy sposob:
Mamy skrzynke odbiorcza i nadawcza. Jesli napiszemy wiadomosc umieszczona ona jest w wyslanych jesli ktos napisze do nas umieszczana jest w odebranych.

Na wiadomosci mozna odpowiadac, jesli ktos do nas odpowie zauwazylem ze zmienia sie data wiadomosci glownej i wedruje ona na gore zas jesli my odpowiemy zmienia sie data wiadomosci glownej w wyslanych i wedruje na gore w wyslanych i teraz pytanie jak to zrobic:

mamy tabele:

wiadomosc z polami:
ID_wiadomosc
Tytul
ID_user1
ID_user2


Wiadomosc_tekst:
ID_wiadomosc
text
ID_user
data

Dziala to nastepujaco przy tworzeniu 1 wiadomosci tworzy sie rekord w tablicy wiadomosc z ID (klucz), tytulem jaki podamy, i uzytkownikami pomiedzy ktorymi nastepuje wymiana wiadomosci
oraz zostanie dodany rekord wiadomosc_tekst w polu ID_wiadomosc (id z dodanego wczesniej rekordu), tresc wiadomosci, ID uzytkownika ktory wyslal wiadomosc i data wyslania.

Przy odpowiedzi tylko dodawane jest pole do wiadomosc_tekst.

Tylko pytanie jak pobrac ostatnie wiadomosci odebrane.

Pasuje to zrobic tak:
pobirze z tabeli message wiadomosci pod warunkiem ze istnieje jakas wiadomosc ktora zostala wyslana nie prez Ciebie i posortuj wedlug daty wyslania wiadomosc przez innego uzytkownika.
i inne zapytanie pobierz z tabeli message wiadomosci pod warunkiem ze istnieje wiadomosc_tekst wyslana przez ciebie i posortuje wedlug daty wyslania wiadomosci przez Ciebie.

Myslalem, myslalem i nie wymyslilem takiego zapytania(nawet probujac dodac dodatkowego pola do tabeli "wiadomosc" np. ostatnia_wiadomosc (data).


Jedyne co wymyslilem to:

stworzyc tabele:
wiadomosc z polami:
ID_wiadomosc
Tytul
ID_user1
ID_user2

wiadmosc_lista
ID_wiadomosc - klucz obcy
ostatnia_wyslana
ostatnia_odebrana
ID_user

Wiadomosc_tekst:
ID_wiadomosc
text
ID_user
data

i teraz tak przy wysylaniu tworzymy rekord w tabeli wiadomosc tak jak wyzej.
Nastepnie tworzymy 2 rekordy w tabeli wiadomosc_lista:
1 rekord to ID_user ktory wyslal wiadomosc i uzupelniamy pole ostatnia_wyslana
2 rekord to ID_user do ktorego wiadomosc zostala wyslana i uzupelniamy pole ostatnia_odebrana.

no i oczywiscie tworzymy wiadomosc_tekst jaki zostal wyslany na zasdazie jak wyzej

potem przy dodawaniu odpowiedz jesli uzytkownik dodal odpowiedz to updatujemy wiadomosc_lista o ostatnia wyslana
a uzytkownikowi do ktorego zostala wyslana wiadomosc updatujemy o date ostatnio_odebrana

pobieramy wyslane za pomoca
selecta * from wiadmosc_lista as wl, wiadomosc as w where ID_user=ID and wl.id_wiadomosc=w.id_wiadomosc and ostatnio_wyslane!=NULL order by date ostatnio_wyslane
i dzieki temu pobiera nam wszystkie wiadomosci wyslane za pomoca jednego zapytania posortowane po dacie.
Analogicznie pobieramy wiadomosci odebrane.

Teraz tylko pytanie czy to jest optymalne. Czy to jest dobry sposob czy moze jest lepszy?
Czekam na wasze sugestie poniewaz tu tworzymy az 3 tablice na wiadomosci same.

pozdrawiam