Filtrer les likes des utilisateurs si le compte a été créé x jours avant le sujet

Salut,

J’essaie d’ajouter un autre filtre où si un utilisateur a été créé moins de 2 jours avant qu’un certain sujet n’ait été créé, alors il ne sera pas inclus.

Voici ce que j’ai essayé. Je suis relativement nouveau avec SQL, donc je ne sais pas comment m’y prendre. Quelqu’un peut-il m’aider ?

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

Je ne suis pas sûr de ce que vous attendez avec ceci ? Pourriez-vous nous donner un peu plus de détails sur ce que vous essayez d’accomplir ?

J’essaie de corriger le filtre de date pour exclure les utilisateurs créés moins de 2 jours avant la création d’un sujet. On m’a dit d’utiliser datediff ou INTERVAL, mais je n’ai réussi à faire fonctionner aucun des deux.

Et j’avais besoin d’aide pour ajouter le sujet t comme une autre jointure interne, mais j’ai résolu cela avec :
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 t.id s’affiche sous forme de nombre plutôt que d’aperçu. Y a-t-il un moyen de résoudre cela également ?

Pour celui-ci, il vous suffit d’utiliser t.id AS topic_id et cela fera sa magie pour vous. :+1:

Il y a quelques autres exemples de la magie d’Explorer que vous pouvez utiliser dans ce sujet - IDs in Data Explorer - #3 by tshenry aussi

Quand vous dites « un certain sujet », sera-ce le même sujet à chaque fois ? (c’est-à-dire un identifiant de sujet statique)

1 « J'aime »

Oui, le même sujet à chaque fois.

Je pense que j’ai réussi avec ça. Il y avait plus de 1000 résultats, alors j’ai essayé d’ajouter
AND t.id = post.topic_id

Cela a réduit la liste à 16 résultats, mais il y avait toujours 4 résultats identiques. Je ne sais pas comment corriger cela.

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 : J’ai changé
INNER JOIN posts p on p.topic_id = p.topic_id
en
INNER JOIN posts p on p.topic_id = t.id
ce qui a réduit à 16 résultats comme avant.

Maintenant, je pense que la raison pour laquelle il y a encore 16 résultats est que t.id = t.id. Je ne sais pas quoi changer par contre.

Il y a quelques problèmes avec celui-ci, bien que je ne sois pas assez doué en SQL pour les expliquer entièrement. :slightly_smiling_face:

Je pense que vous n’auriez pas besoin de topic_id si vous avez déjà post_id, car l’ID du post est unique à ce post (et au sujet). Vous semblez également essayer de joindre certaines des tables supplémentaires sur des champs qui ne sont pas dans la deuxième table (par exemple, t.id = t.id est exactement le même champ dans la table des sujets). Et si le sujet sur lequel vous interrogez est statique, vous n’auriez pas besoin d’un INTERVAL relatif car ce sera toujours la même date (c’est-à-dire 2 jours avant la création du post 15000), vous pourriez donc définir cela comme une date explicite.

Je n’ai pas encore eu l’occasion d’essayer ma propre version, mais j’ai appris la plupart de mes compétences en SQL/badges en cherchant des exemples sur Meta et en y glanant des bribes. :slight_smile: Beaucoup d’entre eux sont sous le tag data-explorer, et il y a une foule d’exemples pour différentes choses dans Quelques idées de requêtes de badges courantes qui pourraient valoir la peine d’être parcourues ?

Oui, je sais, mais chaque fois que je supprime le AND pour l’id du topic, les résultats remontent à 1000 pour une raison quelconque. Je vais consulter le lien que vous avez envoyé. J’espère pouvoir résoudre certains des problèmes là-bas.

Je ne suis toujours pas sûr de comprendre ce que vous cherchez ici, mais si vous connaissez l’ID du post et la date à partir de laquelle vous souhaitez inclure de nouveaux utilisateurs, alors peut-être quelque chose comme ceci ?

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

Cela donnerait une liste des utilisateurs qui ont aimé un certain post, et qui ont créé leur compte après la date que vous entrez (ordonnée par la date à laquelle ils l’ont aimé).

2 « J'aime »

J’ai réussi à tout faire fonctionner, je ne savais pas pour reltime et je l’ai implémenté. Merci encore pour votre aide !

Une dernière question concernant reltime. Y a-t-il un moyen de changer le nom de “time” en “Sujet créé” par exemple ?

1 « J'aime »

Absolument. :slightly_smiling_face: Si vous le changez en reltime$topic_created, cela devrait faire l’affaire. :+1:

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