C’è un modo per filtrare gli argomenti esistenti nel forum in base al gruppo di utenti a cui appartiene l’autore dell’ultima risposta?
Ad esempio, dopo aver definito un gruppo di utenti come “clienti”, voglio filtrare tutti gli argomenti a cui gli utenti clienti non hanno ancora risposto.
Se il tuo forum ha installato il plugin Data Explorer, potresti scrivere query SQL per recuperare queste informazioni dal database di Discourse. Questa query tenta di recuperare l’ID e il titolo degli argomenti e l’ID dell’utente dell’ultimo post nell’argomento. Seleziona solo gli argomenti in cui l’ultimo post è stato effettuato da un utente nel gruppo ‘clients’.
Questo è solo un esempio.
SELECT
t.id AS topic_id,
t.title AS topic_title,
(SELECT user_id FROM posts WHERE topic_id = t.id ORDER BY created_at DESC LIMIT 1) AS last_post_user_id
FROM
topics t
JOIN
posts p ON p.topic_id = t.id
JOIN
group_users gu ON gu.user_id = p.user_id
JOIN
groups g ON g.id = gu.group_id
WHERE
g.name = 'clients'
GROUP BY
t.id
HAVING
MAX(p.user_id) = last_post_user_id
ORDER BY
MAX(p.created_at) DESC
Nessun problema. Penso che quello modificato funzioni. Solo per informazione, potrebbe anche essere utile inserire alcuni filtri aggiuntivi per escludere argomenti/post eliminati, messaggi privati e post di tipo Sussurri/Piccola Azione. Qualcosa come:
SELECT
t.id AS topic_id,
t.title AS topic_title,
(SELECT user_id FROM posts WHERE topic_id = t.id ORDER BY created_at DESC LIMIT 1) AS last_post_user_id
FROM topics t
JOIN posts p ON p.topic_id = t.id
JOIN group_users gu ON gu.user_id = p.user_id
JOIN groups g ON g.id = gu.group_id
WHERE g.name = 'clients'
AND t.deleted_at ISNULL
AND p.deleted_at ISNULL
AND p.post_type = 1
AND t.archetype = 'regular'
GROUP BY t.id
HAVING MAX(p.user_id) = last_post_user_id
ORDER BY MAX(p.created_at) DESC
Anche se non credo che questo catturerebbe argomenti in cui l’OP ha risposto di nuovo (ad esempio, per dire ‘grazie’ ecc.), quindi potrebbe essere necessario un metodo diverso a seconda di ciò che stai cercando @kenjdarhan. Si tratterebbe specificamente di argomenti creati dai clienti che hanno ricevuto una risposta da un membro del team e che non erano ancora risolti? Qualcosa del genere?
Si tratta semplicemente degli argomenti in cui l’ultima risposta è stata creata da un utente del gruppo utente “client”.
Se un argomento è stato risposto da un utente non cliente (cioè, uno dei miei colleghi), non avrò bisogno di concentrarmi su quell’argomento perché il collega che ha risposto continuerà a risolvere il problema nell’argomento se il problema non è stato risolto.
Questo sembra che tu abbia bisogno di qualcosa di leggermente diverso. Ogni forum è leggermente diverso, quindi le soluzioni potrebbero dover essere adattate, ma descriverei questo brief come “argomenti creati da utenti nel gruppo ‘client’, senza risposta da un utente nel gruppo ‘team’”. Se è così, potresti adattare questa query con i group_ids corretti e dovrebbe fare quello che vuoi:
-- [params]
-- date :start_date = 01/01/2023
-- date :end_date = 01/06/2023
WITH team_replies AS (
SELECT topic_id
FROM posts
WHERE user_id IN (SELECT user_id FROM group_users WHERE group_id = 3) --group_id del tuo gruppo 'team'
AND post_number <> 1
AND deleted_at ISNULL
AND post_type = 1
GROUP BY topic_id
)
SELECT t.created_at::date,
t.id AS topic_id,
MIN(p.id) AS first_post_id
FROM topics t
JOIN posts p ON p.topic_id = t.id
WHERE t.user_id IN (SELECT user_id FROM group_users WHERE group_id = 45) -- group_id del tuo gruppo 'client'
AND t.id NOT IN (SELECT topic_id FROM team_replies)
AND t.created_at BETWEEN :start_date AND :end_date
AND t.deleted_at ISNULL
AND t.archetype = 'regular'
GROUP BY t.id
ORDER BY 1 ASC
Questo funziona meglio se conosci i group_ids invece di usare i nomi dei gruppi. Puoi trovarli nel JSON del gruppo (ad esempio, /g/admins.json), anche se puoi anche usare qualcosa di simile come una furbesca ricerca:
-- [params]
-- string :group_name
SELECT name,
id
FROM groups
WHERE name LIKE LOWER (:group_name)
E dovrai anche aggiornare la pagina la prima volta che copi incolli le query nel tuo esploratore di dati per visualizzare le caselle di input dei parametri.