Themen nach Benutzergruppe filtern

Gibt es eine Möglichkeit, die vorhandenen Themen im Forum danach zu filtern, zu welcher Benutzergruppe der Autor der letzten Antwort gehört?

Zum Beispiel möchte ich, nachdem ich eine Gruppe von Benutzern als “Kunden” definiert habe, alle Themen filtern, auf die die Kundenbenutzer noch nicht geantwortet haben.

Vielen Dank für jede Hilfe.

Wenn Ihr Forum das Data Explorer Plugin installiert hat, könnten Sie SQL-Abfragen schreiben, um diese Informationen aus der Discourse-Datenbank abzurufen. Diese Abfrage versucht, die ID und den Titel von Themen sowie die Benutzer-ID des letzten Beitrags im Thema abzurufen. Sie wählt nur Themen aus, bei denen der letzte Beitrag von einem Benutzer in der Gruppe ‘clients’ verfasst wurde.

Dies ist nur ein Beispiel.

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 „Gefällt mir“

Ich bin mir nicht sicher, ob wir eine t.last_post_id haben?

1 „Gefällt mir“

Danke, dass Sie das gefunden haben, es gibt kein Feld last_post_id in der topics-Tabelle. :face_with_spiral_eyes:

2 „Gefällt mir“

Keine Sorge. Ich denke, die bearbeitete Version funktioniert. :+1: :slight_smile: Nur zur Info, es kann auch nützlich sein, ein paar Extras einzufügen, um gelöschte Themen/Beiträge, PMs und Whispers/Small Action-Beiträge herauszufiltern. Etwas wie:

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

Ich glaube jedoch nicht, dass dies Themen erfasst, bei denen der OP erneut geantwortet hat (z. B. um ‘danke’ usw. zu sagen), daher könnte eine andere Methode erforderlich sein, je nachdem, was Sie suchen, @kenjdarhan. Würde es sich speziell um vom Kunden erstellte Themen handeln, auf die ein Teammitglied geantwortet hat und die noch ungelöst waren? So etwas in der Art?

4 „Gefällt mir“

Hallo Jammy,

Es handelt sich lediglich um die Themen, bei denen die letzte Antwort von einem Benutzer aus der Benutzergruppe „Kunde“ erstellt wurde.

Wenn ein Thema von einem Nicht-Kunden (d. h. einem meiner Kollegen) beantwortet wurde, muss ich mich nicht auf dieses Thema konzentrieren, da der Kollege, der geantwortet hat, das Problem in dem Thema weiter lösen wird, falls es noch nicht gelöst wurde.

1 „Gefällt mir“

Das klingt, als ob du etwas anderes brauchst. :slight_smile: Jedes Forum ist etwas anders, daher müssen Lösungen möglicherweise angepasst werden, aber ich würde diese Anforderung als „Themen, die von Benutzern in der Gruppe ‚Client‘ erstellt wurden und auf die kein Benutzer in der Gruppe ‚Team‘ geantwortet hat“ beschreiben. Wenn das der Fall ist, könntest du diese Abfrage mit den richtigen group_ids anpassen, und sie sollte das tun, was du möchtest:

-- [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 deiner 'team'-Gruppe
  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 deiner 'client'-Gruppe
  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

Dies funktioniert reibungsloser, wenn du die group_ids kennst, anstatt Gruppennamen zu verwenden. Du findest sie in der Gruppen-JSON (z. B. /g/admins.json), du kannst aber auch etwas wie das hier als schlaue Nachschlagefunktion verwenden:


-- [params]
-- string :group_name

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

Außerdem musst du die Seite beim ersten Kopieren und Einfügen der Abfragen in deinen Daten-Explorer aktualisieren, damit die Eingabefelder für die Parameter angezeigt werden. :+1:

Danke Jammy. Ich werde das versuchen.