SQL вложенное соединение к одной таблице данных - PullRequest
0 голосов
/ 10 октября 2018

Надеюсь, я правильно сформулировал.

У меня есть простая таблица данных (blog_comments):

1.id

2.post_id

3.комментарий

4.дата

5.addedby

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 голосов
/ 10 октября 2018

Поскольку вы хотите включить текст комментария к ответу, это фактически означает, что вы не можете группировать по исходному комментарию, поскольку каждый комментарий к ответу будет уникальным и, следовательно, не может быть сгруппирован.

Если вы хотите, чтобы общее количествоголосует за все ответы, затем вам нужно удалить текст ответа из возвращенных столбцов.Единственными столбцами из части ответа должны быть 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
...