Re: [請益] 關於討論區程式的文章列表

看板PHP作者 (亞布里艾爾發芽>//<)時間16年前 (2010/01/28 13:42), 編輯推噓1(103)
留言4則, 1人參與, 最新討論串3/3 (看更多)
※ 引述《september02 (九月二號)》之銘言: : 像PTT這BBS : 1.文章列表中有個+,代表這文章你還沒有讀過 : 2.有個~,代表你讀過後又有新的推文 : 3.數字代表推文數 : 如果要在PHP中實現這個功能 : 3是很簡單,幾乎各種討論區程式都有 : 1大部份的討論區程式,都是利用HYPER LINK 點過後顏色會不同(CSS) : 來讓使用者判斷這文章是否已讀過 : 我的問題是在2這個功能,讀過後如果有新的回應,要出現某種符號 : 在我的預想中,要實現這個功能必須要記錄使用者讀過哪些文章以及讀的時間 : 在秀出文章列表時,才能比對該文章的更新時間和上次該使用者的讀取時間 : 來計算是否要出現那個新推文的符號 : 可是這樣恐怕會大幅拖累程式的效能 : 因為使用者每讀一次,就要用資料庫來記錄一筆包含ID,文章ID,timestamp的資料 : 假設記錄前一百篇文章(感覺PTT好像記錄的更多?) : 文章列表每頁秀20篇文章 : 那等於做出一個文章列表,就要多20次的SELECT動作 : 雖然我的討論區人不像PTT那麼多,但是如果同時有200人在線上 : 這樣子恐怕電腦大部份的效能,都用在做文章列表了吧 : 有沒有什麼別的方法更有效率達到功能2呢? : 盼指教,謝謝 如果只要做到以上功能 倒是不需要記錄讀取時間 建一個table user_post 欄位有userid, postid, status [ ENUM:('newResponse','allRead')] Primary key是(userid, postid) 當使用者u讀了文章p時 replace into `user_post` VALUES (u,p,'allRead'); 當文章p有新回應時 update `user_post` SET `status` = 'newResponse' WHERE `postid` = p (如果使用者又讀了有新回應的文章 replace會將這筆紀錄的status設為'allread') 當使用者u要看文章列表時 你只要一個select select user_post.`status` (和其他post資料如title, postid等等) from post left join user_post on post.`postid` = user_post.`postid` and user_post.`userid` = u 然後看status欄位 如果是NULL就代表未讀(顯示+) newResponse代表有新回應(顯示~) allRead就是都讀過了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.96.114.50

01/28 15:41, , 1F
沒記錄時間恐怕會出問題.user不只一位呀~
01/28 15:41, 1F

01/28 15:53, , 2F
我懂你的意思了,這樣沒有記錄時間也可以辦到.
01/28 15:53, 2F

01/28 15:54, , 3F
不過最後那段select怪怪的,怎麼沒有postid?
01/28 15:54, 3F

01/28 15:54, , 4F
應該要有 post.* 可不是?
01/28 15:54, 4F
文章代碼(AID): #1BOIFMZv (PHP)
文章代碼(AID): #1BOIFMZv (PHP)