トピック作成のx日前までに作成されたアカウントのユーザーの「いいね」をフィルターで除外する

こんにちは。

トピックが作成されてから2日未満で作成されたユーザーを除外する別のフィルターを追加しようとしています。

試したことは以下の通りです。SQLはまだあまり使っていないので、どうすればよいかわかりません。何か助けはありますか?

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

この件について、どのようなことを求めているのか分かりかねます。どのようなことを達成しようとしているのか、もう少し詳しく教えていただけますでしょうか?

トピックが作成される2日前に作成されたユーザーを除外するように日付フィルターを修正しようとしています。datediffまたはINTERVALのいずれかを使用するように言われましたが、どちらも機能しませんでした。

トピックtを別の内部結合として追加するのを手伝ってもらう必要がありましたが、それは次のように解決しました。
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はプレビューではなく数値として表示されますが、それについても同様の方法はありますか?

この件については、t.id AS topic_id とエイリアスを設定するだけで、うまく機能するはずです。:+1:

Explorer のその他の魔法のような使い方については、こちらのトピックでもいくつか例を紹介しています - IDs in Data Explorer - #3 by tshenry

「特定のトピック」とおっしゃいますが、毎回同じトピックになりますか?(つまり、静的なトピック ID ですか)

「いいね!」 1

毎回同じトピックですね。

これで動作するようになったと思います。これには1000件以上の結果があったので、次を追加してみました。
AND t.id = post.topic_id

これによりリストは16件に短縮されましたが、それでも同じものが4件ありました。これを修正する方法がわかりません。

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'

編集:
INNER JOIN posts p on p.topic_id = p.topic_id
INNER JOIN posts p on p.topic_id = t.id に変更したところ、以前のように16件に絞り込まれました。

まだ16件ある理由は、t.id = t.id だからだと思います。しかし、これを何に変更すればよいかわかりません。

ただし、いくつか問題があります。SQLについては、それらを完全に説明できるほど熟練していません。:slightly_smiling_face:

post_id が既にある場合、topic_id は不要だと思います。投稿IDは、その投稿(およびトピック)に固有であるためです。また、2番目のテーブルにないフィールド(例: t.id = t.id は、トピックテーブル内のまったく同じフィールドです)で追加テーブルの一部を結合しようとしているようです。クエリ対象のトピックが静的な場合、相対的な INTERVAL は不要です。常に同じ日付(つまり、投稿15000が作成される2日前)になるため、明示的な日付として設定できます。

まだ自分のバージョンを試す機会はありませんが、SQL/バッジのスキルのほとんどは、さまざまな例についてメタを検索し、それらの断片を寄せ集めることから学びました。:slight_smile: それらの多くは data-explorer タグの下にあり、一般的なバッジクエリのアイデア にはさまざまな例があり、参照する価値があるかもしれません。

ええ、わかっています。しかし、トピックIDのANDを削除するたびに、なぜか結果が1000まで戻ってしまいます。送っていただいたリンクを確認します。そこで問題が解決できることを願っています。

ここでおっしゃっていることがまだよく理解できていないのですが、post_id と新しいユーザーを含めたい日付がわかっているなら、このようなものでしょうか?

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

これは、特定の投稿に「いいね!」をしたユーザーのうち、入力した日付以降にアカウントを作成したユーザーのリストを(「いいね!」した順に)返します。

「いいね!」 2

すべて機能するようになりました。reltime については知りませんでしたが、実装しました。改めてご協力ありがとうございました!

最後の質問ですが、reltime に関してです。「time」という名前を「Topic created」のように変更する方法はありますか?

「いいね!」 1

はい。 :slightly_smiling_face: reltime$topic_created に変更すると、うまくいくはずです。 :+1:

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