Questa è una versione SQL del report della dashboard per il rapporto di segnalazione degli utenti.
Questo report della dashboard genera un elenco di utenti ordinati in base al rapporto tra le risposte dello staff alle loro segnalazioni (concordate e discordate). Il report include informazioni sull’attività di segnalazione di ciascun utente, concentrandosi in particolare sul numero di segnalazioni con cui i moderatori sono stati d’accordo, in disaccordo o che sono state ignorate, nonché su un punteggio calcolato che rappresenta le prestazioni di segnalazione dell’utente.
Il report è utile per gli amministratori per identificare gli utenti che segnalano accuratamente contenuti inappropriati, valutare il coinvolgimento degli utenti nella moderazione della community, fornire feedback sulle pratiche di segnalazione e valutare le prestazioni di segnalazione degli utenti per potenziali ruoli di moderatore.
-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2024-02-01
SELECT
u.id AS user_id,
u.username,
CASE
WHEN u.silenced_till IS NOT NULL THEN 't'
ELSE 'f'
END AS silenced,
SUM(CASE WHEN rs.status = 2 THEN 1 ELSE 0 END)::numeric AS disagreed_flags,
SUM(CASE WHEN rs.status = 1 THEN 1 ELSE 0 END)::numeric AS agreed_flags,
SUM(CASE WHEN rs.status = 3 THEN 1 ELSE 0 END)::numeric AS ignored_flags,
(
CASE
WHEN SUM(CASE WHEN rs.status = 2 THEN 1 ELSE 0 END)::numeric = 0 THEN
SUM(CASE WHEN rs.status = 1 THEN 1 ELSE 0 END)::numeric * SUM(CASE WHEN rs.status = 1 THEN 1 ELSE 0 END)::numeric
ELSE
ROUND(
(1 - (SUM(CASE WHEN rs.status = 1 THEN 1 ELSE 0 END)::numeric / SUM(CASE WHEN rs.status = 2 THEN 1 ELSE 0 END))) *
(SUM(CASE WHEN rs.status = 2 THEN 1 ELSE 0 END) - SUM(CASE WHEN rs.status = 1 THEN 1 ELSE 0 END)::numeric)
)
END
) AS score
FROM
users AS u
INNER JOIN reviewable_scores AS rs ON rs.user_id = u.id
WHERE
u.id > 0
AND rs.created_at >= :start_date
AND rs.created_at <= :end_date
GROUP BY
u.id,
u.username,
u.uploaded_avatar_id,
u.silenced_till
ORDER BY
score DESC
LIMIT 100
Spiegazione della query SQL
Ecco una ripartizione della query:
- Parametri: La query accetta due parametri,
:start_datee:end_date, che consentono all’utente di specificare l’intervallo di date per il report. Entrambi i parametri di data accettano il formato dataAAAA-MM-GG. - Clausola SELECT: La query seleziona le seguenti colonne:
user_id: L’identificatore univoco dell’utente.username: Il nome utente dell’utente.silenced: Un valore booleano che indica se l’utente è attualmente silenziato.disagreed_flags: Il numero totale di segnalazioni dell’utente con cui i moderatori non sono stati d’accordo.agreed_flags: Il numero totale di segnalazioni dell’utente con cui i moderatori sono stati d’accordo.ignored_flags: Il numero totale di segnalazioni dell’utente che sono state ignorate dai moderatori.score: Un punteggio calcolato che rappresenta le prestazioni di segnalazione dell’utente.
- Clausola FROM: La query unisce la tabella
userscon la tabellareviewable_scoressull’user_idper ottenere informazioni di segnalazione relative a ciascun utente. - Clausola WHERE: La query filtra i dati per includere solo i record degli utenti con un
idmaggiore di 0 e dove la datacreated_atdei punteggi revisionabili rientra nell’intervallo di date specificato. - Clausola GROUP BY: La query raggruppa i risultati per
user_id,username,uploaded_avatar_idesilenced_tillper aggregare i dati di segnalazione per ciascun utente. - Clausola ORDER BY: La query ordina i risultati in base allo
scorecalcolato in ordine decrescente per mostrare prima gli utenti con le migliori prestazioni di segnalazione. - Clausola LIMIT: La query limita i risultati ai primi 100 utenti in base allo score calcolato.
Esempio di risultati
| user | username | silenced | disagreed_flags | agreed_flags | ignored_flags | score |
|---|---|---|---|---|---|---|
| user_1_id | user_1 | f | 0.0 | 10.0 | 3.0 | 100.0 |
| user_2_id | user_2 | f | 0.0 | 6.0 | 3.0 | 36.0 |
| user_3_id | user_3 | f | 0.0 | 4.0 | 0.0 | 16.0 |
| … | … | … | … | … | … | … |