2017-10-31 6 views
0

3人のユーザーを追跡したユーザーの数を取得するためにRailsアプリケーションのSQLクエリを作成しようとしています。アカウントを作成してから24時間以内にメモを残してください。アカウント作成後24時間以内にいくつかの属性を持つユーザーを取得するPostgresqlクエリ

モデル構造は次のとおりです。

  • ユーザーモデルIDとcreated_at列があり、そしてユーザーhas_manyは、以下とコメント。
  • は、モデルは、ユーザのIDとfollower_type、又は"Tag"いずれかであり、ならびにcreated_atに一致follower_idを有する従います。
  • コメントモデルには、ユーザーのIDと一致するuser_idcreated_atがあります。

私のSQLスキルが劣っているので、それほど遠くはないです。私が得た最も近いものはこれと同じものでした。

select count(*) 
from users 
where created_at >= 
(select follows.created_at 
    from follows 
    where follows.follower_id = users.id); 
+0

'選択follow.created_at 投稿者 where follows.follower_id = users.id'これはcreated_atの配列を返します、そして、それはどのように比較されますか?私は何を求めているのか分かりません。あなたはもっと説明することができます – Gabbar

+0

ええ、それは私が到達していない部分です。私が与えたクエリは、私が得た最も近いクエリに過ぎず、いくつかの部分にはまっていました。 – PandyZhao

+0

ActiveRecordを使用するのではなく、生のSQLでこれを行う理由はありますか? – james00794

答えて

1

これは可能なActiveRecordソリューションです。私はIRBでこれの変種のみをテストしたことに注意してください。あなたのモデルは私の前提とは多少異なるかもしれません。また、私はSQLのエキスパートではありませんので、効率的ではありません。

User 
    .joins("LEFT OUTER JOIN follows as fu on fu.follower_id = users.id AND fu.created_at < (users.created_at + interval '1 day') AND fu.follower_type = 'User'") 
    .joins("LEFT OUTER JOIN follows as ft on ft.follower_id = users.id AND ft.created_at < (users.created_at + interval '1 day') AND ft.follower_type = 'Tag'") 
    .joins("LEFT OUTER JOIN comments as c on c.user_id = users.id AND c.created_at < (users.created_at + interval '1 day')") 
    .group("users.id") 
    .having("COUNT(distinct fu.id)>=3 AND COUNT(distinct ft.id)>=3 AND COUNT(distinct c.id)>=1") 

コンソールの出力を見て、生のSQLに変換することができます。

+0

これは間違いなく素晴らしいスタートです。後の時間は古い時間よりも長いと考えられるので(10/31/2017> 10/29/2017 == true)、記号よりも小さい記号を記号よりも大きいものに変更する必要があると思います。 私のデータに対してクエリを実行しても動作しないようです。私はゼロのエントリを取得します。 – PandyZhao

+1

本当ですか?ユーザーが '10/30/2017 08:00'で作成された場合、user.created_at + 1日は' 10/31/2017 08:00'です。 '10/30/2017 12:00'にコメントが作成された場合、そのコメントをカウントに含めます。だから、 '' 10/30/2017 12:00 '<'10/31/2017 08:00' == true'は、上記がテストしているものです。 – james00794

+0

ああ、あなたが正しいと思います。私はRailsプロジェクトを作ってサンドボックスにしたいと思っています。そして、その方法で、一貫した数値とデータを持つことができました。 https://github.com/Zhao-Andy/sql-example-project – PandyZhao

関連する問題