繁体   English   中英

选择带有评论和回复的故事,并在一个查询中检查当前用户是否喜欢

[英]select the story with its comments and replies and check if current user likes or not in one single query

我有四个桌子

帖子:

post_id     title    Userid    description
1           test     20           TEXT

评论:

comment_id     post_id    Userid    content
1                1           5        TEXT
2                1           36       TEXT
3                1           6        TEXT

回覆

reply_id     comment_id    Userid    content
1                1           4        TEXT
2                2           5        TEXT
3                2           30       TEXT

喜欢:

post_id     Userid
1           5

该站点开始在数据库中加载最后20个故事。现在假设已登录userid(5),例如post_id(1)显示为“喜欢”,并且所有帖子都显示了其评论和答复。 我想在一个查询中完成此操作,而不是在循环内部执行嵌套循环。

我的代码:

$sql1 = $conn->prepare("SELECT * FROM posts ORDER BY post_id DESC LIMIT 20");
$sql1->execute();
   while($row1=$sql1->fetch(PDO::FETCH_ASSOC)){
        ....
        // <div class="post" id="<?php echo row1['post_id']; ?> </div>
         .
         .
         ....
         $sql2 = $conn->prepare("SELECT * FROM comments WHERE post_id=:post_id");
         $sql2 ->bindValue(':post_id', $row1['post_id']);
         $sql2 -> execute();
         while($row2=$sql2 -> fetch(PDO::FETCH_ASSOC)){
                ....
                // <div class="comment" id="<?php echo row2['comment_id']; ?> </div>
                .
                .
                ....
                $sql3 = $conn->prepare("SELECT * FROM replies WHERE comment_id=:comment_id");
                $sql3 -> bindValue(':comment_id', $row2['comment_id']);
                $sql3 ->execute();
                  while($row3=$sql3 ->fetch(PDP::FETCH_ASSOC)){ .... }

         }
         $sql_like=$conn->prepare("SELECT * from likes WHERE post_id = $row1['post_id'] AND user_id=$logged_user_id");
          $sql_like->execute();
          $sql_like->rowCount() > 1 ? //userlikes : //user does not like ;
   }

您的问题不是100%清楚的,但是您可以从以下内容开始:

$sql1 = $conn->prepare("SELECT p.*, 
                 c.comment_id, 
                 r.reply_id, 
                 COUNT(DISTINCT l.post_id) likes
             FROM (SELECT
                FROM posts 
                ORDER BY post_id DESC LIMIT 20
             ) p
             LEFT JOIN comments c 
             ON p.post_id = c.post_id
             LEFT JOIN replies r
             ON c.comment_id=r.comment_id
             LEFT JOIN likes l
             ON l.post_id = p.post_id
               AND l.user_id=$logged_user_id");
$sql1->execute();
   $last_post_id = 0;
   $last_comment_id = 0;
   while($row = $sql1->fetch(PDO::FETCH_ASSOC)){
     if ($last_post_id != row['post_id'] ) {
        echo '<div class="post" id="'.$row['post_id'].'>'.$row['post_id'].'</div>';
        echo '<div class="like">'.$row['likes'].'</div>';
        ...
        $last_post_id = row['post_id'];
        $last_comment_id = 0;
     }
     ...
     if ($last_comment_id != $row['comment_id']) {
       echo '<div class="comment" id="'.$row['comment_id'].'>'.$row['comment_id'].'</div>';
       $last_comment_id = $row['comment_id'];
     }
     ...                    .
     echo '<div class="reply" id="'.$row['reply_id'].'>'.$row['reply_id'].'</div>';

   }

您可以使用子查询在与帖子ID相匹配的点赞表中,从已登录用户的点赞数中进行计数。

SELECT *,
   (SELECT COUNT(*) FROM likes l WHERE l.post_id=p.post_id AND user_id = '$logged_user_id') AS userlikes 
   FROM posts p ORDER BY p.post_id DESC LIMIT 20

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM