Comment filtrer les sujets par groupe d'utilisateurs

Existe-t-il un moyen de filtrer les sujets existants sur le forum en fonction du groupe d’utilisateurs auquel appartient l’auteur de la dernière réponse ?

Par exemple, après avoir défini un groupe d’utilisateurs comme « clients », je veux filtrer tous les sujets auxquels les utilisateurs clients n’ont pas répondu.

Merci pour toute aide.

Si votre forum a le plugin Data Explorer installé, vous pourriez écrire des requêtes SQL pour récupérer ces informations de la base de données Discourse. Cette requête tente de récupérer l’ID et le titre des sujets, ainsi que l’ID de l’utilisateur du dernier message du sujet. Elle ne sélectionne que les sujets où le dernier message a été posté par un utilisateur du groupe ‘clients’.

Ceci n’est qu’un exemple.

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 « J'aime »

Je ne suis pas sûr que nous ayons un t.last_post_id ?

1 « J'aime »

Merci de l’avoir trouvé, il n’y a pas de champ last_post_id dans la table topics. :face_with_spiral_eyes:

2 « J'aime »

Pas de souci. Je pense que la version modifiée fonctionne. :+1: :slight_smile: Juste pour information, il peut également être utile d’ajouter quelques filtres supplémentaires pour les sujets/messages supprimés, les MP et les messages de type Whispers/Small Action. Quelque chose comme :

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

Cependant, je ne pense pas que cela attraperait un sujet où l’OP a répondu à nouveau (par exemple, pour dire ‘merci’ etc.), donc cela pourrait nécessiter une méthode différente en fonction de ce que vous recherchez @kenjdarhan. S’agirait-il spécifiquement de sujets créés par des clients qui ont reçu une réponse d’un membre de l’équipe et qui n’étaient pas résolus ? Quelque chose comme ça ?

4 « J'aime »

Bonjour Jammy,

Il s’agit simplement des sujets dans lesquels la dernière réponse a été créée par un utilisateur du groupe d’utilisateurs « client ».

Si un sujet a reçu une réponse d’un utilisateur non client (c’est-à-dire un de mes collègues), je n’aurai pas besoin de me concentrer sur ce sujet car le collègue qui a répondu continuera à résoudre le problème dans le sujet si le problème n’a pas été résolu.

1 « J'aime »

Cela semble indiquer que vous avez besoin de quelque chose d’un peu différent. :slight_smile: Chaque forum est légèrement différent, donc les solutions peuvent nécessiter des adaptations, mais je décrirais cette demande comme « sujets créés par des utilisateurs du groupe ‘client’, sans réponse d’un utilisateur du groupe ‘équipe’ ». Si tel est le cas, vous pourriez adapter cette requête avec les group_ids corrects et elle devrait faire ce que vous voulez :

-- [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 de votre groupe 'équipe'
  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 de votre groupe '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

Cela fonctionne plus facilement si vous connaissez les group_ids plutôt que d’utiliser les noms de groupe. Vous pouvez les trouver dans le JSON du groupe (par exemple, /g/admins.json), bien que vous puissiez également utiliser quelque chose comme ceci pour une recherche rapide :


-- [params]
-- string :group_name

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

Et vous devrez également actualiser la page la toute première fois que vous copiez-collez les requêtes dans votre explorateur de données pour qu’il prenne en compte les champs de saisie des paramètres. :+1:

Merci Jammy. Je vais essayer ça.