Я пытаюсь сформулировать один запрос 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
, чтобы получить список пользователей, но я застрял на этом.