Como filtrar tópicos por grupo de usuários

Existe alguma maneira de filtrar os tópicos existentes no fórum com base no grupo de usuários ao qual o autor da última resposta pertence?

Por exemplo, depois de definir um grupo de usuários como “clientes”, quero filtrar todos os tópicos em que os usuários clientes ainda não responderam.

Obrigado por qualquer ajuda.

Se o seu fórum tiver o plugin Data Explorer instalado, você poderá escrever consultas SQL para buscar essas informações no banco de dados do Discourse. Esta consulta tenta buscar o ID e o título dos tópicos, e o ID do usuário da última postagem no tópico. Ela seleciona apenas tópicos onde a última postagem foi feita por um usuário do grupo ‘clients’.

Este é apenas um exemplo.

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 curtida

Não tenho certeza se temos um t.last_post_id?

1 curtida

Obrigado por encontrar isso, não há um campo last_post_id na tabela topics. :face_with_spiral_eyes:

2 curtidas

Sem problemas. Acho que a versão editada funciona. :+1: :slight_smile: Só para constar, também pode ser útil adicionar alguns extras para filtrar tópicos/posts excluídos, MPs e Posts de Sussurro/Ação Pequena. Algo como:

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

Embora eu não ache que isso pegaria qualquer tópico onde o OP respondeu novamente (por exemplo, para dizer ‘obrigado’, etc.), então pode precisar de um método diferente dependendo do que você está procurando, @kenjdarhan. Seriam especificamente tópicos criados por clientes que receberam uma resposta de um membro da equipe e também não foram resolvidos? Algo assim?

4 curtidas

Olá Jammy,

São apenas os tópicos em que a última resposta foi criada por um usuário do grupo de usuários “cliente”.

Se um tópico foi respondido por um usuário não cliente (ou seja, um dos meus colegas), não precisarei focar nesse tópico porque o colega que respondeu continuará a resolver o problema no tópico se o problema ainda não tiver sido resolvido.

1 curtida

Isso parece que você precisa de algo um pouco diferente. :slight_smile: Cada fórum é ligeiramente diferente, então as soluções podem precisar ser adaptadas, mas eu descreveria este resumo como “tópicos criados por usuários no grupo ‘cliente’, sem resposta de um usuário no grupo ‘equipe’”. Se for esse o caso, você pode adaptar esta consulta com os group_ids corretos e ela deve fazer o que você deseja:

-- [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 do seu grupo 'equipe'
  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 do seu grupo 'cliente'
  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

Isso funciona de forma mais suave se você souber os group_ids em vez de usar nomes de grupos. Você pode encontrá-los no JSON do grupo (por exemplo, /g/admins.json), embora você também possa usar algo como isso como uma consulta discreta:


-- [params]
-- string :group_name

SELECT name,
       id
FROM groups
WHERE name LIKE LOWER (:group_name)

E você também precisará atualizar a página na primeira vez que copiar e colar as consultas em seu explorador de dados para que as caixas de entrada de parâmetros sejam exibidas. :+1:

Obrigado, Jammy. Vou tentar isso.