我一直在为自己的项目构建评论系统,以及我目前确定当前登录用户是否已对评论投票(上调或下调)的方式不是很聪明。现在我每次都会在显示评论时查询数据库,这对于每页100多条评论来说并不理想。这意味着100多个额外的查询。
我尝试使用JOIN和LEFT JOIN以及LEFT OUTER JOIN,我无法自己弄清楚如何做到这一点。我尝试的任何东西都没有给我我需要的结果。
这是我提出的,但我无法弄清楚如何只合并用户投票的价值。
$q_get_comments = $conn->prepare('
SELECT comments.id,
comments.parent,
comments.subpage,
comments.author_id,
comments.author,
comments.message_cut,
comments.regdate,
comments.points,
votes_comments.user_id,
votes_comments.user_name,
votes_comments.comm_id,
votes_comments.direction
FROM comments LEFT JOIN votes_comments
ON comments.id = votes_comments.comm_id
WHERE comments.subpage= :subpage
ORDER BY points DESC, regdate DESC');
$q_get_comments->execute(array(':subpage' => $sub_id));
我的表格设置如下:
评论
id parent subpage author_id author message message_cut ip regdate points up down
------------------------------------------------------------------------------------------
1 0 68 6 name msg <p>msg</p> x date 5 4 0
2 0 68 6 name msg <p>msg</p> x date 3 2 0
3 2 68 6 name msg <p>msg</p> x date 2 3 2
投票
id user_id user_name comm_id direction
------------------------------------------
1 6 Chris 2 0
2 6 Chris 3 2
3 6 Chris 1 1
votes.comm_id 匹配 comments.id ,这就是我尝试加入表格的方式。
但我只想加入 user_id = 6 的结果,并且仍然显示子页面的所有评论,并且只添加..说.. user_id 和指示到评论
中的相应结果我需要的结果,最后用方向值来确定投票状态。
id parent subpage author_id author message message_cut ip regdate points up down direction
------------------------------------------------------------------------------------------
1 0 68 6 name msg <p>msg</p> x date 5 4 0 0
2 0 68 6 name msg <p>msg</p> x date 3 2 0 NULL
3 2 68 6 name msg <p>msg</p> x date 2 3 2 2
如果direction为NULL,或者可能是空白字段,则用户没有对此评论进行投票,如果它有一个值,或者沿着这些行。 (在代码方向0表示撤销/中立投票,1表示upvote,2表示downvote,因此如果方向存在,我可以知道用户以某种方式对此评论投票,并且我可以显示正确的html以进行投票)
提前感谢您提供任何帮助或提示!
答案 0 :(得分:1)
只需进行2次查询(sudo代码,只显示sql,而不是实际的db调用)来选择注释和投票,然后在php中合并结果:
$comments = $db->prepare('SELECT * FROM comments WHERE subpage = :subpage');
$comments->execute(array('subpage' => $subpage_id));
$commentsById=array();
foreach($comments as $comment)
$commentsById[$comment['id']]=$comment
$votes = $db->prepare('SELECT * FROM votes WHERE user_id = :user_id AND comm_id IN (' . implode(",", array_keys($commentsById)) . ')');
$votes->execute(array('user_id' => $user_id)); // the user_id of the user
foreach($votes as $vote)
$commentsById[$vote['comm_id']]['direction'] = $vote['direction'];
var_dump($commentsById);