Это SQL-версия отчета панели управления по топ-пользователям по количеству полученных лайков от различных пользователей.
Этот отчет панели управления показывает топ-пользователей, получивших лайки от широкого круга пользователей сайта за указанный период времени. Запрос предназначен для выявления пользователей, чьи публикации получили наибольшее количество лайков, при этом каждое значение в столбце «likes» представляет количество уникальных пользователей, поставивших лайк их постам.
--[params]
--date :start_date = 2024-01-01
--date :end_date = 2025-01-01
SELECT
p.user_id,
u.username,
COUNT(DISTINCT ua.user_id) AS likes
FROM
user_actions ua
INNER JOIN posts p ON p.id = ua.target_post_id
INNER JOIN users u ON p.user_id = u.id
WHERE
ua.created_at::date BETWEEN :start_date AND :end_date
AND ua.action_type = 1
AND p.user_id > 0
GROUP BY
p.user_id,
u.username,
ORDER BY
likes DESC
Объяснение SQL-запроса
- Параметры даты:
- Запрос принимает два параметра:
:start_dateи:end_date, которые определяют диапазон дат для отчета. Оба параметра даты принимают форматГГГГ-ММ-ДД.
- Запрос принимает два параметра:
- Выборка: Основные столбцы, выбираемые для вывода:
p.user_id: ID пользователя, опубликовавшего пост.u.username: Имя соответствующего пользователя.likes: Количество уникальных ID пользователей (ua.user_id), поставивших лайк постам, что обеспечивает подсчет уникальных лайков от каждого пользователя.
- Соединения: Выполняются два inner join:
user_actions uaсposts p: Связывает действия с соответствующими постами.posts pсusers u: Связывает посты с их авторами, обеспечивая получение информации о пользователях.
- Фильтрация:
- Условие
WHEREприменяет несколько фильтров:ua.created_at::date BETWEEN :start_date AND :end_dateограничивает рассматриваемые действия теми, что попадают в указанный диапазон.ua.action_type = 1выделяет действия типа «лайк» из других типов действий пользователей.p.user_id > 0исключает любые лайки, связанные с незарегистрированными пользователями (например, системными или анонимными).
- Условие
- Группировка:
- Результат группируется по
p.user_idиu.username. Это обеспечивает агрегацию лайков по каждому пользователю и соответствующему имени.
- Результат группируется по
- Сортировка:
- Результаты сортируются по количеству лайков (
likes DESC), выводя наиболее оцененных пользователей в начале списка.
- Результаты сортируются по количеству лайков (
Пример результатов
| user | username | likes |
|---|---|---|
| user1 | user1 | 100 |
| user2 | user2 | 90 |
| user3 | user3 | 80 |
| … | … | … |