Filtrar curtidas de usuários se a conta foi criada x dias antes da criação do tópico

Olá,

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

Não tenho certeza do que você quer com isso? Você poderia nos dar um pouco mais de detalhes sobre o que você está tentando alcançar?

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?

Para este, você só precisa usar t.id AS topic_id como alias e ele fará sua mágica para você. :+1:

Existem alguns exemplos adicionais da mágica do Explorer que você pode usar neste tópico - IDs in Data Explorer - #3 by tshenry também

Quando você diz ‘um certo tópico’, será o mesmo tópico de cada vez? (ou seja, um ID de tópico estático)

1 curtida

Sim, o mesmo tópico de sempre.

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. :slightly_smiling_face:

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. :slight_smile: 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).

2 curtidas

Consegui fazer tudo funcionar, nunca soube sobre reltime e o implementei. Obrigado novamente pela ajuda!

Uma última pergunta sobre o reltime. Existe uma maneira de mudar o nome de “time” para, digamos, “Tópico criado”?

1 curtida

Com certeza. :slightly_smiling_face: Se você mudar para reltime$topic_created isso deve resolver. :+1:

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.