one2many отношения.
Нужно посчитать все комменты и посты юзеров за определенное время.
Запрос:
> const query = `
SELECT nickname, email, COUNT(p.id) AS postCount, COUNT(c.id) AS commentCount, ((CAST(COUNT(p.id) AS REAL) + CAST(COUNT(c.id) AS REAL))/10) AS total
FROM users AS u
LEFT JOIN posts AS p ON u.id = p.authorId AND p.published_at BETWEEN :begin AND :end
LEFT JOIN comments AS c ON u.id = c.authorId AND c.published_at BETWEEN :begin AND :end
GROUP BY u.nickname
ORDER BY total;
`;
Датасеты для тестирования:
1. 2 пользователя, у каждого по несколько постов, комментов нет. Все ок.
2. 2 пользователя, у первого пользователя 1 пост, у второго 2, у первого пользователя 1 коммент. Все ок
3. 2 пользователя, у первого пользователя 1 пост, у второго 2, у каждого пользователя по 1 коммента. С этого момента начинается веселье:
[
{
nickname: 'test1',
email: 'test1@mail.com',
postCount: 1,
commentCount: 1
},
{
nickname: 'test2',
email: 'test2@mail.com',
postCount: 2,
commentCount: 2 // но коммент 1
}
]
4. 2 пользователя, у первого пользователя 1 пост, у второго 2, у каждого пользователя по 4 коммента
[
{
nickname: 'test1',
email: 'test1@mail.com',
postCount: 4,
commentCount: 4
},
{
nickname: 'test2',
email: 'test2@mail.com',
postCount: 8,
commentCount: 8
}
]
Где я ошибся?
У вас получилось декартово произведение постов на комменты Вам нужен UNION между постами и комментами
спасибо, пойду гуглить UNION)
Выложите таблицы и тестовые данные на SQLize.online Так легче будет Вам помочь
Мне кажется лучше преаггрегированные джойны
модели геренируются ORM, т.ч. так просто не получится)
Обсуждают сегодня