1

私のウェブサイトには、通常、大、小の3種類の注目の投稿を含む注目のセクションがあります。現在、次のように3つの別々のクエリで3つのタイプをフェッチしています。

@featured_big_first = Post.visible.where(pinged: 1).where('overlay_type =?', :big).limit(1)
@featured_big_first = Post.visible.where(pinged: 1).where('overlay_type =?', :small).limit(1)
@featured_big_first = Post.visible.where(pinged: 1).where('overlay_type =?', :normal).limit(5)

基本的に、これら3つを1つにまとめて、1つの大きな、1つの小さな、5つの通常の投稿をフェッチするクエリを探しています。

4

2 に答える 2

2

注文を望まないのなら、私は驚きます。あなたがそれを持っているように、それはランダムな小さい、ランダムな大きい、そして5つのランダムな正規分布を見つけることになっています。

はい、UNIONを使用できます。ただし、SQLの実行を行う必要があります。3つのクエリそれぞれのSQLのログを確認し、UNIONを間に挟んで3つのクエリのそれぞれである文字列のSQLを実行します。動作するか、制限に問題がある可能性があります。

SQLでは、テーブルをそれ自体に結合し、テーブルのエイリアスの1つでgroup byを実行し、他のエイリアステーブルが<= group by tableである場合、および<=のカウントが存在するhaving句を追加することで可能です。 =テーブルが制限を下回っています。

したがって、postsテーブルの単純なクエリ(表示およびpingされた条件なし)があり、最新のcreated_at日付のレコードが必要な場合、通常のクエリは次のようになります。

SELECT posts1.*
FROM posts posts1, posts posts2
WHERE posts2.created_at >= posts1.create_at
  AND posts1.overlay_type = 'normal'
  AND posts2.overlay_type = 'normal'
GROUP BY posts1.id
HAVING count(posts2.id) <= 5

このSQLを使用して、posts1とposts2の両方に条件を使用することを忘れないで、表示とpingの条件を追加します。

次に、大小のバージョンとUNIONをすべて一緒に作成します。

私は3つのデータベース呼び出しに固執します。

于 2012-09-21T13:17:03.147 に答える
1

私はこれが可能だとは思いませんがscope、コードを書くためのより多くのレールの方法を使用することができます

また、タイプミスの可能性もありますが、再割り当てしている@featured_big_firstため、最後のクエリのデータのみが含まれます

post.rbで

  scope :overlay_type_record lamda{|type| joins(:visible).where(["visible.pinged=1 AND visible.overlay_type =", type])}

とコントローラーで

@featured_big_first = Post.overlay_type_record(:big).limit(1)
@featured_small_first = Post.overlay_type_record(:small).limit(1)
@featured_normal_first = Post.overlay_type_record(:normal).limit(5)
于 2012-09-20T08:40:03.773 に答える