172 похожих чатов

Привет! Есть 3 таблицы users, posts, comments. Между users и остальными таблицами

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
}
]

Где я ошибся?

5 ответов

9 просмотров

У вас получилось декартово произведение постов на комменты Вам нужен UNION между постами и комментами

Выложите таблицы и тестовые данные на SQLize.online Так легче будет Вам помочь

Roman-Pogorelov 🇺🇦 Автор вопроса
Slava Rozhnev SQLtest.online https://phpize.online
Выложите таблицы и тестовые данные на SQLize.onlin...

модели геренируются ORM, т.ч. так просто не получится)

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта