Benutzer-Likes herausfiltern, wenn Konto x Tage vor Themen-Erstellung erstellt wurde

Hallo,

Ich versuche, einen weiteren Filter hinzuzufügen, bei dem Benutzer, die weniger als 2 Tage vor der Erstellung eines bestimmten Themas erstellt wurden, nicht einbezogen werden.

Das habe ich versucht. Ich bin relativ neu in SQL und weiß nicht, wie ich vorgehen soll. Kann mir jemand helfen?

SELECT *
FROM topic t
INNER JOIN post_actions pa ON pa.post_id = t.id
INNER JOIN users u ON u.id = pa.user_id
WHERE t.id = 1
    AND pa.post_action_type_id = 2
    AND u.created_at < DATE(t.created_at, '-2 days')

Ich bin mir nicht sicher, was Sie mit diesem hier wollen? Könnten Sie uns bitte etwas mehr darüber erzählen, was Sie erreichen möchten?

Ich versuche, den Datumsfilter so zu korrigieren, dass Benutzer herausgefiltert werden, die weniger als 2 Tage vor der Erstellung eines bestimmten Themas erstellt wurden. Mir wurde entweder datediff oder INTERVAL empfohlen, aber keines von beiden hat funktioniert.

Und ich brauchte Hilfe beim Hinzufügen des Themas t als weiteres Inner Join, aber das habe ich gelöst mit:
FROM post_actions pa INNER JOIN users u ON u.id = pa.user_id INNER JOIN topics t on t.id = t.id
t.id wird als Zahl anstelle einer Vorschau angezeigt. Gibt es dafür auch eine Lösung?

Für diesen Fall müssen Sie nur t.id AS topic_id als Alias verwenden, und es wird seine Magie für Sie entfalten. :+1:

Es gibt noch ein paar weitere Beispiele für die Magie von Explorer, die Sie in diesem Thema verwenden können - IDs in Data Explorer - #3 by tshenry auch

Wenn Sie von ‘einem bestimmten Thema’ sprechen, wird es jedes Mal dasselbe Thema sein? (d. h. eine statische Thema-ID)

1 „Gefällt mir“

Ja, das gleiche Thema jedes Mal.

Ich glaube, ich habe es damit zum Laufen gebracht. Es gab über 1000 Ergebnisse, also habe ich versucht, Folgendes hinzuzufügen:
AND t.id = post.topic_id

Dies verkürzte die Liste auf 16 Ergebnisse, aber es gab immer noch 4 Ergebnisse desselben Dings. Ich bin mir nicht sicher, wie ich das beheben kann.

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: Habe INNER JOIN posts p on p.topic_id = p.topic_id zu INNER JOIN posts p on p.topic_id = t.id geändert, was es wie zuvor auf 16 Ergebnisse reduzierte.

Jetzt glaube ich, dass der Grund, warum es immer noch 16 gibt, darin liegt, dass t.id = t.id. Ich bin mir nicht sicher, was ich stattdessen ändern kann.

Es gibt jedoch ein paar Haken bei diesem, obwohl ich nicht gut genug mit SQL bin, um sie vollständig erklären zu können. :slightly_smiling_face:

Ich denke, Sie bräuchten die topic_id nicht, wenn Sie bereits die post_id haben, da die Post-ID für diesen Beitrag (und das Thema) eindeutig ist. Sie scheinen auch zu versuchen, einige der zusätzlichen Tabellen anhand von Feldern zu verbinden, die sich nicht in der zweiten Tabelle befinden (z. B. t.id = t.id ist genau dasselbe Feld innerhalb der Themen-Tabelle). Und wenn das Thema, gegen das Sie abfragen, statisch ist, benötigen Sie kein relatives INTERVAL, da es immer dasselbe Datum ist (d. h. 2 Tage vor der Erstellung von Beitrag 15000), sodass Sie dies als explizites Datum festlegen könnten.

Ich hatte noch keine Gelegenheit, meine eigene Version auszuprobieren, aber ich habe die meisten meiner SQL/Badge-Kenntnisse durch die Suche nach verschiedenen Beispielen auf Meta und das Sammeln von Teilen davon erworben. :slight_smile: Viele davon sind unter dem #data-explorer-Tag zu finden, und es gibt eine Fülle von Beispielen für verschiedene Dinge in Einige gängige Badge-Abfrageideen, die sich vielleicht lohnen, durchzusehen?

Ja, ich weiß, aber immer wenn ich das UND für die Themen-ID entferne, steigen die Ergebnisse aus irgendeinem Grund wieder auf 1000. Ich werde mir den Link ansehen, den Sie gesendet haben. Hoffentlich kann ich einige der Probleme dort lösen.

Ich bin mir immer noch nicht sicher, ob ich verstehe, was Sie hier wollen, aber wenn Sie die post_id und das Datum kennen, von dem an Sie neue Benutzer einbeziehen möchten, dann vielleicht so etwas wie dieses?

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

Dies würde eine Liste von Benutzern ergeben, die einen bestimmten Beitrag „geliked“ haben und deren Konto nach dem von Ihnen eingegebenen Datum erstellt wurde (sortiert nach dem Zeitpunkt, an dem sie ihn „geliked“ haben).

2 „Gefällt mir“

Ich habe es geschafft, alles zum Laufen zu bringen, ich wusste nichts von reltime und habe es implementiert. Nochmals vielen Dank für die Hilfe!

Eine letzte Frage bezüglich reltime: Gibt es eine Möglichkeit, den Namen von „time“ in „Topic created“ zu ändern?

1 „Gefällt mir“

Absolut. :slightly_smiling_face: Wenn Sie es in reltime$topic_created ändern, sollte das funktionieren. :+1:

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