Считайте в многократном соединении - PullRequest
0 голосов
/ 04 мая 2019

У меня есть три таблицы Сообщение: int id, varchar title Комментарий: int comment_id, int post_id, varchar comment Нравится: int like_id, int post_id
Здесь post_id - ссылки на внешние ключиtable post .

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

Вот что у меня естьсделано до сих пор:


    SELECT post.id, post.title, count(comment.id) as comments,

    FROM post

    left join comment on comment.post_id = post.id

    GROUP by post.id

Это дает мне результат для всех постов и количество комментариев, сделанных к каждому посту.Теперь, как только я добавлю следующее левое объединение для таблицы лайков, результат подсчета вернется в два раза больше его фактического значения.

Например, если в сообщении X было 2 комментария, и я добавил подобно табличное объединениеподсчет того же поста дает мне 4, как общее количество комментариев к посту X.

Помощь оценена.

1 Ответ

3 голосов
/ 04 мая 2019

Я бы написал это, используя два отдельных подзапроса, чтобы найти количество комментариев и лайков:

SELECT
    p.id,
    p.title,
    COALESCE(c.comment_cnt, 0) AS comments,
    COALESCE(l.like_cnt, 0) AS likes
FROM post p
LEFT JOIN
(
    SELECT post_id, COUNT(*) AS comment_cnt
    FROM comments
    GROUP BY post_id
) c
    ON p.id = c.post_id
LEFT JOIN
(
    SELECT post_id, COUNT(*) AS like_cnt
    FROM likes
    GROUP BY post_id
) l
    ON p.id = l.post_id;
...