Według mnie w strukturze tabeli brakuje pola odpowiedzialnego za przechowanie informacji o tym, że dany użytkownik już komunikat widział i go przeczytał. Aktualnie każdy komunikat admina będzie wyświetlał się każdemu użytkownikowi do czasu ważności.
Osobiście informację o przeczytaniu komunikatu przez użytkownika umieściłbym w osobnej tabeli łączącej id wiadomości z id użytkownika. Wtedy proces wyświetlania powiadomień wyglądałby tak:
- pobierz id użytkownika
- pobierz wszystkie ważne komunikaty
- wyświetl użytkownikowi komunikaty dla których nie ma wpisu w tabeli przeczytane_wiadomości
- gdy użytkownik kliknie przycisk "zamknij" dodaj rekord do tablicy przeczytane_wiadomości
Warto też pomyśleć aby pobranie i ograniczenie listy wiadomości do wyświetlenia zrobić po stronie bazy danych poprzez "inner joina" i odpowiednie warunki "where"
Pozdrawiam