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
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?
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.
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. 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”).