SQL嵌套连接到同一数据表

时间:2018-10-10 00:05:27

标签: sql join nested

我希望我的提法正确。

我有简单的数据表(博客评论):

  

1.id

     

2.post_id

     

3.comment

     

4.date

     

5.add by

     

6.comment_id(用于回复。)

我的想法众所周知。我想显示每个评论的评论和回复,按upvotes排序。

我可以显示不是回复的评论,但无法显示回复。

此刻,此代码:甚至不显示简单的注释。如果我删除reply.*,它将显示简单的注释。

public function getBlogCommentList($post_id){
    try{

        $sortby = "SELECT c.*, reply.*, u.id as user_id, u.username as username, u.image as profile_image,
            SUM(CASE WHEN r.upvote=1 THEN 1 ELSE 0 END) as upvotes,
            SUM(CASE WHEN r.downvote=1 THEN 1 ELSE 0 END) as downvotes
            FROM cb_community.blog_comments c
            LEFT JOIN cb_users.users u ON u.id = c.addedby
            LEFT JOIN cb_community.blog_comment_ratings r ON r.comment_id = c.id
            LEFT JOIN (SELECT rc.*, ru.id as user_id, ru.username as rusername, ru.image as rprofile_image,
                SUM(CASE WHEN rr.upvote=1 THEN 1 ELSE 0 END) as rupvotes,
                SUM(CASE WHEN rr.downvote=1 THEN 1 ELSE 0 END) as rdownvotes
                FROM cb_community.blog_comments rc
                LEFT JOIN cb_users.users ru ON ru.id = rc.addedby
                LEFT JOIN cb_community.blog_comment_ratings rr ON rr.comment_id = rc.id
                WHERE rc.post_id = $post_id AND rc.comment_id is not null GROUP BY rc.id ORDER BY rupvotes DESC) reply ON reply.comment_id = c.id
            WHERE c.post_id = $post_id AND c.comment_id is null GROUP BY c.id ORDER BY upvotes DESC";



    $stmt = $this->conn->prepare("$sortby");
    $stmt->execute();
    $result = $stmt->fetchAll();

        $blog_comments = array();

    foreach($result as $post){
            $blog_comments[] = $post;
        }

    return $blog_comments;

  }
  catch(PDOException $e)
  {
    echo $e->getMessage();
  }
}

仅使用 blog_comments 表进行编辑:

        $sortby = "SELECT c.*
                FROM cb_community.blog_comments c
                LEFT JOIN (SELECT rc.*
                    FROM cb_community.blog_comments rc
                    WHERE rc.post_id = $post_id AND rc.comment_id is not null GROUP BY rc.id) reply ON reply.comment_id = c.id
                WHERE c.post_id = $post_id AND c.comment_id is null GROUP BY c.id";

我不知道我是否进展顺利。我要显示所有评论,并为每个评论显示所有回复。

1 个答案:

答案 0 :(得分:1)

因为要包含回复评论文本,所以实际上意味着您不能按原始评论分组,因为每个回复评论都是唯一的,因此无法汇总。

如果要获得所有答复的总票数,则需要从返回的列中删除答复文本。答复部分中唯一的列应该是SUM(UpVotes)和SUM(DownVotes),然后将它们按原始注释列(以及相关的User和Comment Up / Down Votes列对原始列都是静态的)进行分组。

如果您只想显示原始注释以及每个答复以及原始注释所排序的最终数据集,然后按照UpVotes的顺序显示每个答复,那么您需要:

SELECT c.id as CommentId,
       c.comment as CommentText,
       r.comment as ReplyText,
       v.upvotes as UpVotes,
       v.downvotes as DownVotes
FROM blog_comments c
LEFT JOIN blog_comments r ON c.id = r.commentid
LEFT JOIN blog_comments_rating v ON r.id = v.commentid
WHERE c.commentid IS NULL
ORDER BY c.id, v.upvotes ASC