Estou tentando adicionar outro filtro onde, se um usuário foi criado menos de 2 dias antes de um determinado tópico, ele não será incluído.
É isso que tentei. Sou relativamente novo em SQL, então não sei como proceder. Alguma ajuda?
SELECT *
FROM topic t post_actions pa INNER JOIN users u ON u.id = pa.user_id
WHERE post_id = 1
AND post_action_type_id = 2
AND u.created_at < t.created_at-2
Estou tentando corrigir o filtro de data para excluir usuários criados menos de 2 dias antes da criação de um tópico. Me disseram para usar datediff ou INTERVAL, mas nenhum funcionou.
E eu precisava de ajuda para adicionar o tópico t como outro inner join, mas resolvi isso com: FROM post_actions pa INNER JOIN users u ON u.id = pa.user_id INNER JOIN topics t on t.id = t.id
O t.id aparece como um número em vez de uma prévia, há alguma maneira de resolver isso também?
Então, acho que consegui fazer funcionar com isso. Houve mais de 1000 resultados disso, então tentei adicionar AND t.id = post.topic_id
Isso reduziu a lista para 16 resultados, mas ainda havia 4 resultados da mesma coisa. Não sei como consertar isso.
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: Mudei INNER JOIN posts p on p.topic_id = p.topic_id
para INNER JOIN posts p on p.topic_id = t.id
o que reduziu para 16 resultados como antes.
Agora acho que o motivo de ainda haver 16 é porque t.id = t.id. Não sei o que posso mudar para isso.
Há alguns problemas com este, embora eu não seja experiente o suficiente em SQL para explicá-los totalmente.
Acho que você não precisaria do topic_id se já tiver o post_id, pois o ID da postagem é exclusivo para essa postagem (e tópico). Você também parece estar tentando juntar algumas tabelas extras em campos que não estão na segunda tabela (por exemplo, t.id = t.id é exatamente o mesmo campo dentro da tabela de tópicos). E se o tópico contra o qual você está consultando for estático, você não precisaria de um INTERVAL relativo, pois ele sempre será a mesma data (ou seja, 2 dias antes da criação da postagem 15000), então você poderia defini-lo como uma data explícita.
Ainda não tive a chance de tentar minha própria versão, mas aprendi a maior parte das minhas habilidades em SQL/badges pesquisando no Meta por diferentes exemplos e juntando pedaços deles. Muitos deles estão sob a tag data-explorer, e há uma série de exemplos para coisas diferentes em Algumas ideias comuns de consultas de badges que podem valer a pena dar uma olhada?
Sim, eu sei, mas sempre que removo o AND para o id do tópico, os resultados voltam a 1000 por algum motivo. Vou verificar o link que você enviou. Espero poder resolver alguns dos problemas lá.
Ainda não tenho certeza se estou entendendo o que você quer aqui, mas se você souber o post_id e a data de onde quer incluir novos usuários, talvez algo assim?
-- [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
Isso daria uma lista de usuários que curtiram uma determinada postagem e que criaram suas contas após a data que você inserir (ordenados por quando eles curtiram).