2010-04-11 40 views
10

我有一個系統,其中註冊用戶可以對照片投票或向下投票。這與Stack Overflow的投票系統非常相似。有效檢索PHP和MySQL中的投票系統

我用值存儲在一個表中的票數這樣:

vote_id | vote_comment_id | vote_user_id | vote_date | vote_type 

現在我有一個關於速度和效率以下幾個問題:

問題:一旦用戶打開帶有評論的圖片頁面,如果該用戶已將評論上的UP/DOWN投票顯示出來,我需要該圖片; 「你投了票」或「你投票了」旁邊的評論(在堆棧溢出投票圖像突出顯示)。

MY可能的解決方案:現在,當我打開每個評論圖片頁面我環,我依次通過我的投票表格,以及和檢查,如果用戶已經投票,顯示狀態(我比較vote_user_id與用戶的會話)。

這個效率如何?有沒有人有更好的方法來解決這類問題?

+0

如何存儲它是否爲加票或反票? – 2010-04-11 09:53:25

+0

對不起,錯過了放在這裏。我在我的表中有一個字段'vote_type' – Adnan 2010-04-11 09:56:44

回答

2

您通過投票表循環?你是否將整個數據庫讀入內存然後遍歷它?

您是否試過僅查詢相關數據的數據庫?

SELECT vote_comment_id, vote_type 
FROM vote 
WHERE vote_user_id = 34513 
    AND vote_comment_id IN (3443145, 3443256, 3443983) 
+0

340萬評論。活動網站你有! :) – Atli 2010-04-11 10:22:21

2

你沒有提到你正在使用哪個數據庫,但我假定有一些SQL變體。

如此,而不是通過投票的整個表循環,你可以這樣做

select vote_type from vote_table where vote_comment_id = $commentId and vote_user_id = $userId 

,甚至更好,當你獲取實際的意見,你可以做一個left join像這樣

select c.*, v.vote_type from comments c left join (select * from votes where vote_user_id = $userId) v on v.vote_comment_id = c.comment_id 

然後檢查在您的顯示循環中vote_type是否爲空,向上或向下。如果您有1000條評論,並且每次只顯示10條,則效率可能會降低,在這種情況下,第一種方法應該有所幫助。

[上述評論後編輯約vote_type列]

+0

我使用MySQL,並遺憾忘記它我有vote_type。我現在會嘗試解決您的問題。 – Adnan 2010-04-11 10:00:52

0

難道你不需要用戶投票的任何列,即post_id?

您可以執行select查詢,查看當前帖子和用戶是否存在行 - 如果行被返回,他們已投票。


其實,我只是注意到vote_comment_id不是我讀的(vote_comment)。

您只需要檢查是否有行存在

-1

我的解決辦法是,當他登錄到一個會話獲取所有用戶的選票。 抓取所有的意見IDS成兩個陣列:

$_SESSION['votes'] = array(
    'up' => array(12, 854, 87, 78), 
    'down' => array(84, 32, 77) 
); 

,當用戶訪問自己的ID在任何數組時存在一些網頁檢查。

+4

這是一個令人難以置信的資源浪費。您基本上正在獲取並存儲大量的數據,而這些數據很可能永遠不會被使用。 - 數據已經存儲在MySQL內部,並且在需要MySQL的時候獲取每個投票的效率遠高於在登錄時獲取所有投票並將它們存儲在會話中(實際上是複製它們)將被加載到PHP中的效率在每一個請求。 – Atli 2010-04-11 10:18:45

1

如果您要檢索大量行,請儘量避免使用子查詢。

select c.*, v.vote_type 
from comments c 
left join vote v 
on v.vote_comment_id = c.comment_id 
and v.vote_user_id = $userId 

使用CASE語句顯示/隱藏vote_type。

select c.*, CASE v.vote_user_id WHEN $userId 
THEN v.vote_type /*compare vote_user_id with the user's session*/ 
ELSE null END AS 'votetype' /*hide vote_type */ 
from comments c 
left join vote v 
on v.vote_comment_id = c.comment_id 
0

我有一個類似的邏輯網站。我不跟蹤個人投票(爲此),我只有一個帖子(圖片)表,帶有投票計數和文本字段,其中有userid:vote; userid:vote ... pairs,其中vote是+/-。這種方式我不需要從巨大的選票表中選擇,我需要加載屬於帖子的行。一個簡單的字符串搜索「userid:」將顯示當前用戶是否投票。

ACID交易需要保持投票計數和投票文本字段一致。