Filtra i mi piace degli utenti se l'account è stato creato x giorni prima della creazione dell'argomento

Ehi,

Sto cercando di aggiungere un altro filtro in cui se un utente è stato creato meno di 2 giorni prima di un certo argomento, allora non sarà incluso.

Questo è quello che ho provato. Sono relativamente nuovo con SQL, quindi non sono sicuro di come procedere. Qualche aiuto?

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

Non sono sicuro di cosa tu stia cercando con questo? Potresti darci qualche dettaglio in più su cosa stai cercando di ottenere?

Sto cercando di correggere il filtro della data per escludere gli utenti creati meno di 2 giorni prima della creazione di un certo argomento. Mi è stato detto di usare datediff o INTERVAL ma nessuno dei due ha funzionato.

E avevo bisogno di aiuto per aggiungere l’argomento t come altro inner join, ma l’ho risolto con:
FROM post_actions pa INNER JOIN users u ON u.id = pa.user_id INNER JOIN topics t on t.id = t.id
l’id di t viene mostrato come un numero anziché un’anteprima, c’è un modo per risolvere anche questo?

Per questo ti basta usare t.id AS topic_id e farà la sua magia per te. :+1:

Ci sono altri esempi della magia di Explorer che puoi usare in questo topic - IDs in Data Explorer - #3 by tshenry

Quando dici “un certo topic”, sarà sempre lo stesso topic? (cioè, un ID di topic statico)

1 Mi Piace

Sì, lo stesso argomento ogni volta.

Quindi penso di averlo fatto funzionare con questo. C’erano oltre 1000 risultati da questo, quindi ho provato ad aggiungere
AND t.id = post.topic_id

Questo ha ridotto l’elenco a 16 risultati, ma c’erano ancora 4 risultati della stessa cosa. Non sono sicuro di come risolvere questo problema.

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: Ho cambiato
INNER JOIN posts p on p.topic_id = p.topic_id
in
INNER JOIN posts p on p.topic_id = t.id
che ha ridotto a 16 risultati come prima.

Ora penso che il motivo per cui ce ne sono ancora 16 sia perché t.id = t.id. Non sono sicuro di cosa posso cambiare però.

Ci sono alcuni intoppi con quello, anche se non sono abbastanza esperto di SQL per spiegarli completamente. :slightly_smiling_face:

Penso che non avresti bisogno di topic_id se hai già post_id, poiché l’ID del post è univoco per quel post (e argomento). Sembra anche che tu stia cercando di unire alcune delle tabelle aggiuntive su campi che non sono nella seconda tabella (ad esempio, t.id = t.id è esattamente lo stesso campo all’interno della tabella degli argomenti). E se l’argomento su cui stai interrogando è statico, allora non avresti bisogno di un INTERVAL relativo poiché sarà sempre la stessa data (cioè, 2 giorni prima della creazione del post 15000), quindi potresti impostarla come una data esplicita.

Non ho ancora avuto modo di provare la mia versione, ma ho imparato la maggior parte delle mie competenze SQL/badge cercando su Meta diversi esempi e raccogliendo pezzi di quelli. :slight_smile: Molti di essi sono sotto il tag data-explorer, e ci sono un sacco di esempi per cose diverse in Alcune idee comuni per le query sui badge che potrebbero valere la pena di consultare?

Sì, lo so, ma ogni volta che rimuovo l’AND per l’ID dell’argomento, i risultati tornano a 1000 per qualche motivo. Darò un’occhiata al link che mi hai inviato. Spero di poter risolvere alcuni dei problemi lì.

Non sono ancora sicuro di capire cosa stai cercando, ma se conosci il post_id e la data da cui vuoi includere nuovi utenti, forse qualcosa del genere?

-- [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

Questo darebbe un elenco di utenti che hanno messo “Mi piace” a un certo post e che hanno creato il loro account dopo la data che inserisci (ordinati in base a quando hanno messo “Mi piace”).

2 Mi Piace

Sono riuscito a far funzionare tutto, non avevo mai sentito parlare di reltime e l’ho implementato. Grazie ancora per l’aiuto!

Un’ultima domanda riguardo a reltime: c’è un modo per cambiare il nome da “time” a, ad esempio, “Topic created”?

1 Mi Piace

Certamente. :slightly_smiling_face: Se lo cambi in reltime$topic_created dovrebbe funzionare. :+1:

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