Join таблицы сама на себя вместе с каунтом по условию

Рейтинг: 0Ответов: 1Опубликовано: 16.06.2023

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

Но у меня подзапрос выдает не одну колонку которая привязывается к конкретному юзеру как допустим результат сгруппированый за один день а по всем юзерам.

Понимаю что топчусь где то рядом но никак не пойму в чем ошибка.

select `user_id`,
   count(*) as total,
   (select count(*) as total_today
    from `posts` as `today_posts`
    join `posts` on `today_posts`.`id` = `posts`.`id`
    where `today_posts`.`created_at` between '2023-06-16 00:00:00' and '2023-06-16 23:59:59'
    group by `today_posts`.`user_id`) as `total_today`
from `posts` as postsMain
group by `postsMain`.user_id

Ответы

▲ 3Принят

Обычная условная агрегация.

SELECT `user_id`,
       COUNT(*) AS total,
       SUM(created_at BETWEEN '2023-06-16 00:00:00' AND '2023-06-16 23:59:59') AS `total_today`,
       SUM(created_at BETWEEN '2023-06-10 00:00:00' AND '2023-06-16 23:59:59') AS `total_last_week`
-- если надо - добавить поля с другими условиями отбора
FROM `posts`
GROUP BY user_id