2012-08-22 62 views
3

我有兩張表,一張用於主題,另一張用於回覆。用戶閱讀時將論壇標記爲已讀,然後在發佈新回覆時標記爲新的

+------------------+  +------------------+ 
| forum_topics  |  | forum_posts  | 
+------------------+  +------------------+ 
| topic_id   |  | post_id   | 
| topic_title  |  | post_content  | 
| topic_contents |  | post_date  | 
| topic_date  |  | topic_id   | 
| topic_keywords |  |     | 
+------------------+  +------------------+ 

我想它所以當用戶與話題查看頁面和讀取,讀取特定用戶它被標記的話題。但是,如果另一位用戶來到並回復該線索,我希望它自上次訪問或類似事件後標記爲新帖子。

任何想法?

在此先感謝。

回答

2

您可以連接到用戶和論壇帖子這樣的查詢表做到這一點:

當用戶瀏覽一個論壇,輸入一行到查找表像

userID, topic_id, post_id, currentTime 

然後確定用戶是否已經閱讀過此論壇,您可以查詢該表以查看其用戶ID是否出現在其中 - 這意味着他們已經閱讀了該論壇。

然後,您可以將currentTime列與forum/thread中的最後一個條目進行比較,以查看哪個更大,這會告訴您用戶是否看過最後一篇文章。

編輯:是的,你需要一個日期時間列添加到主題和職位(這通常是很好的做法,無論如何要知道當一個帖子被髮),併爲一些PHP/SQL:

<?php 
$userUpdateTime = gmdate(); // assumed to be either dateTime or unixTimestamp of when user last red the topic/forum 
$qry = ' 
SELECT 
    IF(`forum_topics`.`updateDateTime` > "'.$userUpdateTime.'", "unRead", "Read") 
FROM 
    `forum_topics` '; 
+0

我需要爲我的帖子/主題添加時間,然後我目前只存儲它發佈的日期。你介意在我如何比較當前時間顯示示例代碼,讓我陷入困境。 – Exoon

+0

@Exoon我用你可以在查詢中使用的'if'語句的例子更新答案,以確定它是否已被用戶讀取。如果您有查找表,則可以很好地連接這兩個表,並用查找表列名替換插入的變量以獲取它是否被讀取。 – Fluffeh

+0

對不起,我仍然有點困惑:(我目前得到它,所以當用戶查看一個主題,它進入數據庫的主題ID,userid和currentime並將其標記爲正確讀取,當我進入post_id? – Exoon

0

我使用的每成員表線以下我的論壇:

CREATE TABLE `forum_thread_member` (
    `thread_id` mediumint(8) unsigned NOT NULL DEFAULT '0', 
    `member_id` smallint(5) unsigned NOT NULL DEFAULT '0', 
    `last_post_id` mediumint(8) unsigned NOT NULL DEFAULT '0', 
    `read_flag` bit(1) NOT NULL, 
    `posted_flag` bit(1) NOT NULL, 
    `new_flag` bit(1) NOT NULL, 
    `mark_flag` bit(1) NOT NULL, 
    `bookmark_flag` bit(1) NOT NULL, 
    `hidden_flag` bit(1) NOT NULL, 
    PRIMARY KEY (`thread_id`,`member_id`), 
    KEY `bookmark_flag` (`bookmark_flag`) 
) 

當查詢線程的列表,我左連接就可以了。如果值爲NULL,那麼該線程還沒有被讀取。這可以讓你確切知道一個人讀取並參與了哪些線索。

last_post_id很有用,因爲您可以直觀地跳到並顯示讀取的最後一篇文章。 new_flag被設置爲1每次有人發佈帖子,所以很容易用來直觀地確定線程列表是否有新的(未讀)內容。其他標誌用於管理書籤,隱藏線程等。

當然,這個表格可能會相當大,但只要沒有設置重要標誌(例如,bookmark_flag),您就可以安全地刪除舊記錄。 。如果一個人搜索或瀏覽舊線程,你可以假設他們已經被閱讀(而不是假設他們未讀,就像你對新線程一樣)。