2012-09-20 88 views
1

我在我的網站上有一個精選部分,其中包含三種類型的精選文章:正常,大和小。目前,我取了三種類型的三個單獨的查詢,像這樣:Rails SQL查詢優化

@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) 

基本上我尋找一個查詢,將在這三個結合,一個取1大,1小,5例正常帖子。

回答

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) 
+1

感謝您的建議,我會執行它。在接受你的答案之前,我會等一下,b/c我相信這可以通過使用'UNION'的自定義sql查詢來實現。 – zevstatiev

+0

當然是的,即使我想學習一件新的東西:) – Salil

2

如果您不想訂購,我會很驚訝。就像你所擁有的那樣,它應該找到一個隨機的,隨機的大的隨機法線。

是的,你可以使用UNION。但是,您將必須執行SQL。查看三個查詢中每個查詢的SQL日誌,然後執行一個字符串的SQL查詢,這個字符串是UNION之間的三個查詢的每一個。它可能工作,或者它可能有限制的問題。

在SQL中可以通過將表連接到它自己,在該表的另一個別名上執行一個group,在另一個別名錶爲< = group by table並添加having子句的情況下< =表的數量超出限制。

所以,如果你有職位表的簡單查詢(不可見光和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,並添加條件以顯示和ping,記住爲post1和posts2使用條件。

然後寫出大小版本和UNION它們在一起。

我會堅持三個數據庫調用。