¿Hay alguna forma de filtrar los temas existentes en el foro según el grupo de usuarios al que pertenece el autor de la última respuesta?
Por ejemplo, después de definir un grupo de usuarios como “clientes”, quiero filtrar todos los temas en los que los usuarios clientes no han respondido.
Si tu foro tiene instalado el plugin Data Explorer, podrías escribir consultas SQL para obtener esta información de la base de datos de Discourse. Esta consulta intenta obtener el ID y el título de los temas, y el ID de usuario de la última publicación en el tema. Solo selecciona temas donde la última publicación fue realizada por un usuario del grupo ‘clients’.
Este es solo un ejemplo.
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
No te preocupes. Creo que el editado funciona. Solo para que lo notes, también puede ser útil incluir algunos extras para filtrar temas/publicaciones eliminadas, Mensajes Privados y Publicaciones de Susurros/Acciones Pequeñas. 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
Aunque no creo que esto capture ningún tema en el que el OP respondiera de nuevo (por ejemplo, para decir ‘gracias’, etc.), por lo que podría necesitar un método diferente dependiendo de lo que busques @kenjdarhan. ¿Serían específicamente temas creados por clientes que hubieran recibido una respuesta de un miembro del equipo y que además no estuvieran resueltos? ¿Algo así?
Se trata simplemente de los temas en los que la última respuesta ha sido creada por un usuario del grupo de usuarios “cliente”.
Si un tema ha sido respondido por un usuario que no es cliente (es decir, uno de mis colegas), no necesitaré centrarme en ese tema porque el colega que respondió continuará resolviendo el problema en el tema si el problema no se ha resuelto.
Esto suena a que necesitas algo un poco diferente. Cada foro es ligeramente diferente, por lo que las soluciones pueden necesitar ser adaptadas, pero describiría este resumen como “temas creados por usuarios del grupo ‘cliente’, sin respuesta de un usuario del grupo ‘equipo’”. Si ese es el caso, podrías adaptar esta consulta con los group_ids correctos y debería hacer lo que quieres:
-- [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 tu grupo 'equipo'
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 tu 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
Esto funciona más fluidamente si conoces los group_ids en lugar de usar nombres de grupo. Puedes encontrarlos en el JSON del grupo (por ejemplo, /g/admins.json), aunque también puedes usar algo como esto como una búsqueda descarada:
-- [params]
-- string :group_name
SELECT name,
id
FROM groups
WHERE name LIKE LOWER (:group_name)
Y también necesitarás refrescar la página la primera vez que copies y pegues las consultas en tu explorador de datos para que aparezcan los cuadros de entrada de parámetros.