Come filtrare gli argomenti per gruppo di utenti

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.

Grazie per qualsiasi aiuto.

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
1 Mi Piace

Non sono sicuro che abbiamo un t.last_post_id?

1 Mi Piace

Grazie per averlo trovato, non c’è un campo last_post_id nella tabella topics. :face_with_spiral_eyes:

2 Mi Piace

Nessun problema. Penso che quello modificato funzioni. :+1: :slight_smile: 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?

4 Mi Piace

Ciao Jammy,

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.

1 Mi Piace

Questo sembra che tu abbia bisogno di qualcosa di leggermente diverso. :slight_smile: 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. :+1:

Grazie Jammy. Ci proverò.