SQL - выберите для каждого пользователя общее количество статей и общее количество комментариев к статье. - PullRequest
0 голосов
/ 02 марта 2019

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

username | total_articles | total_comments
John Doe |      3         |    10

Это мой SQL до сих пор, я использую MySQL:

SELECT u.id, u.username, COUNT(a.id) AS total_articles, COUNT(c.id) AS total_comments FROM users u
LEFT JOIN articles a ON u.id = a.user_id
LEFT JOIN comments c ON a.id = c.article_id
GROUP BY u.id;

Я пытался сгруппировать по u.id, a.id, c.id одновременно, но это не работает правильно.

Спасибо.

Ответы [ 5 ]

0 голосов
/ 03 марта 2019

В первом запросе есть все статьи пользователя, во втором отредактированы все комментарии, добавленные пользователем

: используйте LEFT JOIN insted JOIN

SELECT id_total_articles, username, total_articles, total_comments 
              FROM 
                  (
                    SELECT u.id as id_total_articles, u.username, COUNT(a.id) AS total_articles FROM users u
                    LEFT JOIN articles a ON u.id = a.user_id
                    GROUP BY u.id, u.username
                ) as  AC 
                 left join 
                (
                  SELECT u.id as id_total_comments, COUNT(c.id) AS total_comments FROM users u
                  LEFT JOIN comments c ON u.id = c.user_id
                  GROUP BY u.id, u.username 
                ) as  CC 
            ON AC.id_total_articles = CC.id_total_comments;
0 голосов
/ 02 марта 2019

Если вам нужно количество статей для пользователя и общее количество комментариев ко всем статьям пользователя, то это ваш запрос:

SELECT
    u.id,
    u.username,
    COUNT(DISTINCT a.id) AS total_articles,
    COUNT(c.id) AS total_comments
FROM users u
LEFT JOIN articles a 
    ON u.id = a.user_id
LEFT JOIN comments c 
    ON a.id = c.article_id
GROUP BY
    u.id,
    u.username;

Но - если выищите количество комментариев (просто мысль здесь) пользователя - тогда вы хотите присоединиться к таблице комментариев по идентификатору пользователя, а не по идентификатору статьи.

0 голосов
/ 02 марта 2019

Вам не хватает u.username в group by, также COUNT(a.id) должно измениться на COUNT(distinct a.id):

SELECT u.id, u.username, COUNT(distinct a.id) AS total_articles, COUNT(c.id) AS total_comments FROM users u
LEFT JOIN articles a ON u.id = a.user_id
LEFT JOIN comments c ON a.id = c.article_id
GROUP BY u.id, u.username;

Обновление:

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

SELECT a.id article_id , COUNT(c.id) AS total_comments
FROM articles a 
LEFT JOIN comments c ON a.id = c.article_id
GROUP BY a.id

SELECT u.id, u.username, COUNT(distinct a.id) AS total_articles
FROM users u
LEFT JOIN articles a ON u.id = a.user_id
GROUP BY u.id, u.username;
0 голосов
/ 02 марта 2019

Вы агрегируете по связанным измерениям и получаете перерасчет.

Один из подходов заключается в использовании нескольких агрегаций:

SELECT u.id, u.username, COUNT(a.id) AS total_articles,
       SUM(c.num_comments) AS total_comments
FROM users u LEFT JOIN
     articles a
     ON a.user_id = a.id LEFT JOIN
     (SELECT c.article_id, COUNT(c.id) as num_comments
      FROM comments c
      GROUP BY c.article_id
     ) c
     ON a.id = c.article_id
GROUP BY u.id, u.username;
0 голосов
/ 02 марта 2019

используйте u.id, u.username оба столбца в группе по

SELECT u.id, u.username, COUNT(a.id) AS total_articles,
 COUNT(c.id) AS total_comments FROM users u
LEFT JOIN articles a ON u.id = a.user_id
LEFT JOIN comments c ON a.id = c.article_id
GROUP BY u.id, u.username
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...