Requête Data explorer : trouver les messages sans réponses

En suivant le sujet : How to find topics without a reply from someone other than the topic owner?

J’ai créé cette requête, mais dans mon cas, il y a un problème.

PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "t"
LINE 31:    AND t.category_id = ANY ('{48,23}'::int[])

Voici le code de la requête :

-- [params]
-- int :months_ago = 1

WITH query_period as (
    SELECT
        date_trunc('month', CURRENT_DATE) - INTERVAL ':months_ago months' as period_start,
        date_trunc('month', CURRENT_DATE) - INTERVAL ':months_ago months' + INTERVAL '1 month' - INTERVAL '1 second' as period_end
)

SELECT 
p.created_at,
p.topic_id,
p.id as post_id,
p.like_count,
p.post_number,
p.reply_count
FROM posts p
LEFT JOIN post_search_data psd ON psd.post_id = p.id
RIGHT JOIN query_period qp
    ON p.created_at >= qp.period_start
        AND p.created_at <= qp.period_end
WHERE 
      reply_count = 0
      AND post_number != 0
	  AND t.category_id = ANY ('{48,23}'::int[])

J’ai deux questions :

  1. Comment définir la table Categories et obtenir cette erreur ?
  2. Comment démarrer la période un jour après le jour actuel ?
1 « J'aime »

L’erreur est due à l’absence de la colonne category_id dans la table posts. Pour que cela fonctionne, vous devez effectuer une jointure avec la table topics.

Comme ceci :
LEFT JOIN topics t ON t.id = p.topic_id

Si vous détaillez les données dont vous avez besoin, je peux essayer d’ajuster la requête.
Cherchez-vous tous les posts, et non les topics, qui appartiennent aux catégories 48 et 23 ? Les posts et les topics supprimés doivent-ils être exclus du résultat ?

CURRENT DAY() renvoie la date d’aujourd’hui. Quelle est la période que vous souhaitez rechercher ?

3 « J'aime »

Merci pour votre réponse !

Correct

Correct (les sujets ne doivent pas être inclus dans la requête)/

1 mois à partir du timestamp (heure actuelle - 24 heures)

2 « J'aime »

Les publications liées à des sujets supprimés ont également été ignorées.

Période prise en compte dans la requête : period_start: 2021-01-14 / period_end: 2021-02-14

-- [params]
-- int :months_ago = 1

WITH query_period as (
    SELECT
        DATE_TRUNC('day', CURRENT_DATE - INTERVAL '1 day') - INTERVAL ':months_ago months' AS period_start,
        (CURRENT_DATE - INTERVAL '1 day')  AS period_end
)

SELECT 
    p.created_at,
    p.topic_id,
    p.id AS post_id,
    p.like_count,
    p.post_number,
    p.reply_count
FROM posts p
INNER JOIN topics t ON t.id = p.topic_id
WHERE p.reply_count = 0
    AND p.post_number > 1
    AND t.category_id IN (48, 23)
    AND p.deleted_at IS NULL
    AND t.deleted_at IS NULL
    AND p.created_at >= (SELECT period_start FROM query_period)
    AND p.created_at <= (SELECT period_end FROM query_period) 
3 « J'aime »

Super ! Le code fonctionne.

Cependant, lors de mes tests, j’ai constaté que les résultats incluaient également des publications d’utilisateurs qui devraient être exclus. Sur notre forum, la fonction de modération est assurée par des membres de groupes spécifiques.

Peut-on exclure dans la requête les publications d’utilisateurs appartenant à certains groupes ?

J’ai vérifié le fichier .json de la page du sujet et constaté qu’il ne suit, sous une forme visible, que ces détails d’utilisateur :

  • “moderator”
  • “admin”
  • “staff”
  • primary_group_name (n’est pas défini sur notre forum, car les modérateurs peuvent appartenir à différents groupes)
3 « J'aime »