Как подсчитать и сгруппировать по столбцу по отношению один ко многим при обработке 0 случаев? - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь сформулировать один запрос SQL, который будет подсчитывать таблицу по отношению «один ко многим». Вот краткая версия моей схемы:

User(id)
Group(id)
UserGroup(user_id, group_id)
Post(id, user_id, group_id)

Цель состоит в том, чтобы вернуть количество сообщений для каждого пользователя в группе. Специфическая проблема c, с которой я сталкиваюсь, заключается в том, что мой текущий запрос не может вернуть 0 для пользователя, у которого нет сообщений. Вот мой наивный запрос:

  SELECT 
    COUNT(*) as total, 
    user_id
  FROM 
    posts
  WHERE
    group_id = ?
  GROUP BY user_id
  ORDER BY
    total DESC

Это отлично работает, когда у каждого пользователя есть сообщение, но когда у некоторых нет сообщений, они не отображаются в списке. Как я могу написать один запрос, который обрабатывает этот сценарий и возвращает счетчик 0 для указанных пользователей? Я знаю, что мне нужно как-то включить UserGroup, чтобы получить список пользователей, но я застрял на этом.

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Используйте left join:

SELECT u.id, COUNT(*) as total
FROM users u LEFT JOIN
     posts p
     ON p.user_id = u.id AND
        p.group_id = ?
GROUP BY u.id
ORDER BY total DESC
0 голосов
/ 05 августа 2020

Я думаю, что понял, но не уверен, насколько эффективен.

select count(p), u.id from users u left join (select * from workouts where group_id = ?) p on p.user_id = u.id where u.id in (select user_id from user_group where group_id = ?) group by u.id;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...