He creado esta consulta, pero en mi caso hay un problema.
PG::UndefinedTable: ERROR: missing FROM-clause entry for table "t"
LINE 31: AND t.category_id = ANY ('{48,23}'::int[])
Aquí está el código de la consulta:
-- [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[])
Tengo 2 preguntas:
¿Cómo definir la tabla Categories y obtener este error?
¿Cómo iniciar el período 1 día después del día actual?
El error se debe a que no existe la columna category_id en la tabla posts. Para que funcione, necesitas hacer un join con la tabla topics.
Así:
LEFT JOIN topics t ON t.id = p.topic_id
Si detallas los datos que necesitas, puedo intentar ajustar la consulta.
¿Qué buscas: todos los posts, no los topics, que pertenecen a las categorías 48 y 23? ¿Se deben descartar los posts y topics que han sido eliminados en el resultado?
CURRENT DAY() devuelve la fecha de hoy. ¿Cuál es el período que deseas buscar?
Las publicaciones vinculadas a temas eliminados también fueron descartadas.
Período considerado en la consulta: 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)
Pero cuando lo probé, descubrí que los resultados también incluyen publicaciones de usuarios que deberían ser excluidos. En nuestro foro, la función de moderación la realizan miembros de grupos específicos.
¿Podemos excluir en la consulta las publicaciones de usuarios que pertenecen a ciertos grupos?
He revisado el archivo .json de la página del tema y descubrí que solo rastrea de forma visible estos detalles del usuario:
“moderator”
“admin”
“staff”
primary_group_name (no está establecido en nuestro foro, ya que los moderadores pueden pertenecer a diferentes grupos)