Il s’agit d’une version SQL du rapport du tableau de bord pour les solutions acceptées.
Ce rapport fournit un comptage des messages marqués comme solutions au quotidien, sur une plage de dates spécifiée. Il est utile pour comprendre à quelle fréquence les utilisateurs trouvent des réponses à leurs questions et les marquent comme solutions au fil du temps.
-- [params]
-- date :start_date = 2025-03-01
-- date :end_date = 2025-04-01
-- null category_id :category_id
WITH daily_solutions AS (
SELECT
DATE(ta.created_at) AS solution_date,
COUNT(*) AS solution_count
FROM discourse_solved_solved_topics st
JOIN discourse_solved_topic_answers ta ON ta.solved_topic_id = st.id
JOIN posts p ON p.id = ta.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(ta.created_at)
)
SELECT
solution_date,
solution_count
FROM daily_solutions
ORDER BY solution_date
Explication de la requête SQL
Cette requête utilise les tables discourse_solved_solved_topics et discourse_solved_topic_answers, cette dernière ayant été introduite dans le Discourse PR #39806.
- Paramètres : La requête accepte :
- Les paramètres
:start_dateet:end_dateau formatAAAA-MM-JJavec des valeurs par défaut - Un paramètre optionnel
:category_idpour filtrer par catégorie spécifique
- Les paramètres
- Expression de table commune : Utilise une CTE nommée
daily_solutionspour organiser la logique - Jointures :
posts- Garantit que le message de solution existe toujours et n’est pas supprimétopics- Garantit que le sujet existe, n’est pas un message privé et n’est pas suppriméusers- Vérifie que l’auteur de la solution est un utilisateur valide
- Filtrage : La clause
WHERE:- Limite à la plage de dates spécifiée
- Garantit que les utilisateurs sont actifs, non mis en sourdine et non suspendus
- Permet un filtrage optionnel par catégorie
- Regroupement et tri : Regroupe par date et trie chronologiquement
Le résultat de cette requête sera une liste de dates avec le nombre correspondant de messages marqués comme solutions à chacune de ces dates.
Résultats exemples
| jour | solutions_acceptées |
|---|---|
| 2023-11-14 | 16 |
| 2023-11-15 | 5 |
| 2023-11-16 | 10 |
| 2023-11-17 | 4 |
| 2023-11-18 | 2 |
| … | … |