Estoy intentando añadir otro filtro donde si un usuario fue creado hace menos de 2 días antes de que se creara un tema determinado, entonces no se incluirá.
Esto es lo que he intentado. Soy relativamente nuevo en SQL, así que no estoy seguro de cómo abordar esto. ¿Alguna ayuda?
SELECT *
FROM topic t
INNER JOIN post_actions pa ON pa.post_id = t.id
INNER JOIN users u ON u.id = pa.user_id
WHERE t.id = 1
AND pa.post_action_type_id = 2
AND u.created_at < DATE(t.created_at, '-2 days')
Estoy intentando arreglar el filtro de fecha para excluir a los usuarios creados menos de 2 días antes de que se creara un tema determinado. Me han dicho que use datediff o INTERVAL, pero ninguno de los dos me ha funcionado.
Y necesitaba ayuda para agregar el tema t como otro inner join, pero lo resolví con: FROM post_actions pa INNER JOIN users u ON u.id = pa.user_id INNER JOIN topics t on t.id = t.id
t.id se muestra como un número en lugar de una vista previa, ¿hay alguna manera de solucionar eso también?
Creo que lo he conseguido con esto. Hubo más de 1000 resultados de esto, así que intenté añadir AND t.id = post.topic_id
Esto acortó la lista a 16 resultados, pero todavía había 4 resultados de lo mismo. No estoy seguro de cómo arreglar eso.
SELECT
t.id as topic_id,
pa.post_id,
pa.user_id,
pa.created_at,
u.created_at
FROM post_actions pa INNER JOIN users u ON u.id = pa.user_id INNER JOIN topics t on t.id = t.id INNER JOIN posts p on p.topic_id = p.topic_id
WHERE post_id = 15000
AND t.id = 7000
AND post_action_type_id = 2
AND u.created_at < t.created_at - INTERVAL '2 DAY'
EDIT: Cambié INNER JOIN posts p on p.topic_id = p.topic_id
a INNER JOIN posts p on p.topic_id = t.id
lo que lo redujo a 16 resultados como antes.
Ahora creo que la razón por la que todavía hay 16 es porque t.id = t.id. No estoy seguro de a qué puedo cambiarlo.
Sin embargo, hay algunos inconvenientes con ese, aunque no soy lo suficientemente hábil con SQL para explicarlos completamente.
Creo que no necesitarías el topic_id si ya tienes el post_id, ya que el post_id es único para esa publicación (y tema). También parece que estás intentando unir algunas de las tablas adicionales en campos que no están en la segunda tabla (por ejemplo, t.id = t.id es exactamente el mismo campo dentro de la tabla de temas). Y si el tema contra el que estás consultando es estático, entonces no necesitarías un INTERVAL relativo, ya que siempre será la misma fecha (es decir, 2 días antes de que se creara la publicación 15000), por lo que podrías establecerlo como una fecha explícita.
Aún no he tenido la oportunidad de probar mi propia versión, pero aprendí la mayoría de mis habilidades de SQL/insignias buscando en Meta diferentes ejemplos y juntando pedacitos de ellos. Muchos de ellos están bajo la etiqueta data-explorer, y hay una gran cantidad de ejemplos para diferentes cosas en Algunas ideas comunes de consultas de insignias que podrían valer la pena revisar.
Sí, lo sé, pero cada vez que elimino el AND para el id del tema, los resultados vuelven a subir a 1000 por alguna razón. Revisaré el enlace que enviaste. Espero poder resolver algunos de los problemas allí.
Todavía no estoy seguro de seguir lo que buscas aquí, pero si conoces el post_id y la fecha de la que quieres incluir nuevos usuarios, ¿quizás algo como esto?
-- [params]
-- int :post_id
-- date :date
SELECT pa.user_id,
pa.created_at AS reltime$time
FROM post_actions pa
JOIN users u ON u.id = pa.user_id
WHERE pa.post_id = :post_id
AND post_action_type_id = 2
AND u.created_at::date > :date
ORDER BY pa.created_at DESC
Esto te daría una lista de usuarios a los que les gustó una publicación determinada y que crearon su cuenta después de la fecha que ingreses (ordenados por cuándo les gustó).