Это SQL-версия отчёта панели управления по принятым решениям.
Данный отчёт предоставляет количество сообщений, отмеченных как решения, в разрезе дней в пределах указанного диапазона дат. Он полезен для понимания того, как часто пользователи находят ответы на свои вопросы и отмечают их как решения с течением времени.
-- [params]
-- date :start_date = 2025-03-01
-- date :end_date = 2025-04-01
-- null category_id :category_id
WITH daily_solutions AS (
SELECT
DATE(st.created_at) AS solution_date,
COUNT(*) AS solution_count
FROM discourse_solved_solved_topics st
JOIN posts p ON p.id = st.answer_post_id AND p.deleted_at IS NULL
JOIN topics t ON t.id = st.topic_id
AND t.archetype <> 'private_message'
AND t.deleted_at IS NULL
AND (:category_id IS NULL OR t.category_id = :category_id)
JOIN users u ON u.id = p.user_id
WHERE
st.created_at BETWEEN :start_date AND :end_date
AND u.id > 0
AND u.active
AND u.silenced_till IS NULL
AND u.suspended_till IS NULL
GROUP BY DATE(st.created_at)
)
SELECT
solution_date,
solution_count
FROM daily_solutions
ORDER BY solution_date
Пояснение к SQL-запросу
Этот запрос использует таблицу discourse_solved_solved_topics, введённую в discourse-solved PR #352:
- Параметры: Запрос принимает:
- Параметры
:start_dateи:end_dateв форматеГГГГ-ММ-ДДсо значениями по умолчанию - Необязательный
:category_idдля фильтрации по конкретной категории
- Параметры
- Общее табличное выражение (CTE): Использует CTE с именем
daily_solutionsдля организации логики - Соединения (Joins):
posts— гарантирует, что сообщение с решением всё ещё существует и не удаленоtopics— гарантирует, что тема существует, не является личным сообщением и не удаленаusers— проверяет, что автор решения является действительным пользователем
- Фильтрация: В предложении
WHERE:- Ограничивает запрос указанным диапазоном дат
- Гарантирует, что пользователи активны, не заглушены и не приостановлены
- Позволяет необязательную фильтрацию по категории
- Группировка и сортировка: Группирует по дате и сортирует в хронологическом порядке
Результатом выполнения этого запроса будет список дат с соответствующим количеством сообщений, отмеченных как решения в каждый из этих дней.
Пример результатов
| день | accepted_solutions |
|---|---|
| 2023-11-14 | 16 |
| 2023-11-15 | 5 |
| 2023-11-16 | 10 |
| 2023-11-17 | 4 |
| 2023-11-18 | 2 |
| … | … |