联接表以获取注释列表,并确定用户是否已对评论投赞成票/反对票


Joining tables for a comment list and determine if the user already upvoted/downvoted the comment

我一直在为我自己的项目构建一个评论系统,我目前确定当前登录的用户是否对评论投了赞成票(赞成或反对)的方式不是很聪明。现在,每次显示评论时,我都会查询数据库,这对于每页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

如果方向为 NULL,或者可能是空白字段,则用户没有对此评论进行投票,如果它有他所做的值,或者类似的内容。(在代码方向 0 表示撤销/中立投票,1 表示赞成,2 表示反对,所以如果方向存在,我可以知道用户以某种方式对此评论进行了投票,我可以显示正确的 html 进行投票)

提前感谢您提供的任何帮助或提示!

只需进行 2 个查询(sudo 代码,仅显示 sql,而不是实际的数据库调用)即可选择注释和投票,然后将结果合并到 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);