2010-04-11 39 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交易需要保持投票计数和投票文本字段一致。