Tworząc własny skrypt forum doszedłem to punktu postów nieprzeczytanych, nie miałem pomysłu na wykonanie tegoż skryptu
Dodatkowa tabelka w bazie danych z 2 kolumnami do której są wkładane informacje o tym że dany post został PRZECZYTANY:
topic_id | user_id
Oczywiście topic_id i user_id mają INDEXy.
i gdy listujesz tematy to dodatkowo wyciągasz informację o przeczytaniu, ja mam mniej więcej tak (tu przykład z adodb) :
$topics = $db -> execute('SELECT topics.topic_id, topics.nazwa, topics.creator_id, topics.creator, topics.replies_count, topics.addtime, topic_read.topic_id AS read_id, topic_read.user_id FROM topics LEFT JOIN topic_read ON (topics.topic_id=topic_read.topic_id AND topic_read.user_id='.$player->id.') WHERE topics.kat_id='.$_GET['cat'].' ORDER BY topics.'.$_GET['sort'].' DESC');
Dalej w pętli która listuje wyciągnięte informacje daję instrukcję warunkową sprawdzającego czy
$topics->fields['user_id'] istnieje, jak nie to oznacza post jako Nieprzeczytany.
- Przy dopisywaniu przez kogoś posta do tematu od ID_jakieś_tam są kasowane wszystkie rekordy z tejże tabelki gdzie topic_id == ID_jakieś_tam.
- Jeśli osoba czyta dany temat (informacje też wyciągane z 2 tabel naraz przez JOINowanie, tylko dla konkretnego tematu) i NIE istnieje $topic['user_id'] to wtedy leci insert do tej tabeli oznaczający temat jako przeczytany.
Propozycja Kiri jest dość prosta do wykonania i bardzo zoptymalizowana