Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP和MySQL中投票系统的有效检索_Php_Mysql - Fatal编程技术网

PHP和MySQL中投票系统的有效检索

PHP和MySQL中投票系统的有效检索,php,mysql,Php,Mysql,我有一个系统,注册用户可以对图片的评论投赞成票/反对票。这与Stack Overflow的投票系统非常相似 我使用如下值将投票存储在表中: vote_id | vote_comment_id | vote_user_id | vote_date | vote_type 现在我有几个关于以下方面的速度和效率的问题: 问题:一旦用户打开带有评论的图片页面,我需要知道该用户是否已经对某条评论投了赞成票/反对票,以显示该评论;评论旁边的“你投了赞成票”或“你投了反对票”(在堆栈溢出中,投票图像高亮显

我有一个系统,注册用户可以对图片的评论投赞成票/反对票。这与Stack Overflow的投票系统非常相似

我使用如下值将投票存储在表中:

vote_id | vote_comment_id | vote_user_id | vote_date | vote_type 
现在我有几个关于以下方面的速度和效率的问题:

问题:一旦用户打开带有评论的图片页面,我需要知道该用户是否已经对某条评论投了赞成票/反对票,以显示该评论;评论旁边的“你投了赞成票”或“你投了反对票”(在堆栈溢出中,投票图像高亮显示)

我可能的解决方案:现在,当我打开一个图片页面时,我循环浏览每个评论,我也循环浏览投票表,检查用户是否投票并显示状态(我将投票用户id与用户的会话进行比较)


这有多高效?有谁有更好的方法来解决这类问题吗?

您没有提到您使用的是哪个数据库,但我假设有一些SQL变体

因此,你可以做如下操作,而不是在整个投票表中循环

select vote_type from vote_table where vote_comment_id = $commentId and vote_user_id = $userId
甚至更好的是,当您检索实际注释时,您可以像这样进行
左连接

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
然后检查显示循环中的投票类型是否为null、up或down。如果您有1000条注释,并且一次只显示10条,那么这可能会降低效率,在这种情况下,第一种方法应该会有所帮助


[在上面关于投票类型栏的评论后编辑]

您正在循环浏览投票表?您是否将整个数据库读入内存,然后在其中循环

您是否尝试只查询数据库中的相关数据

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

你不需要为用户投票的内容设置一个专栏吗

您可以执行select查询,查看当前帖子和用户的行是否存在-如果返回一行,则表示他们已投票


事实上,我只是注意到投票评论id并不是我所理解的(投票评论)


您只需检查一行是否存在

我的解决方案是在用户登录会话时获取所有用户的投票。 将所有注释的ID提取到两个数组中:

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

当用户访问某个页面时,请检查其id是否存在于该数组中。

在检索大量行时,请特别避免使用subselect

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语句显示/隐藏投票类型

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

我有一个类似的逻辑网站。我不跟踪个人投票(为此),我只有一个posts(images)表,带有投票计数和一个带有userid:vote的文本字段;用户ID:投票。。。配对,其中投票为+/-。这样我就不需要从庞大的投票表中进行选择,而且我需要加载属于帖子的行。对“userid:”的简单字符串搜索将显示当前用户是否投票


ACID事务需要保持投票计数和投票文本字段的一致性。

您如何存储是赞成票还是反对票?很抱歉,没有将其放在这里。我的表格中有一个字段“vote\u type”,我使用MySQL,很抱歉忘记了,我有一个vote\u type。我现在就试试你的解决方案。那是一种难以置信的资源浪费。您基本上是在获取和存储大量数据,这些数据很可能永远不会被使用。-数据已经存储在MySQL中,让MySQL在需要的时候获取每一张选票要比在登录时获取所有选票并将其存储在会话中(本质上是重复的)效率高得多,在会话中,每次请求时都会将其加载到PHP中。340多万条评论。您在那里的活动站点!:)