2013-01-12 40 views
1

我需要與執行以下操作查詢幫助:導軌 - 複雜的SQL查詢

  1. 開始從最新的記錄,向下走的較舊的記錄。
  2. 它需要通過created_at時間進行排序。
  3. 如果通過created_at時間在數據庫中有新記錄,請回顧它們,但不要獲得我已經從步驟1獲得的記錄。
  4. 我一次只能獲取16條記錄。這個數字可以稍後改變。
  5. 請勿回顧之前發送的記錄。

也只是爲了讓你知道,這是通過$ .ajax開始。

原因是因爲我正在將新舊記錄實時發送到客戶端。認爲就像用戶開始訪問網站一樣,它會從新的開始獲取當前記錄。然後用戶可以獲取較舊的記錄,但是在相同的請求下,它也檢索到全新的記錄。每次只能記錄16條記錄。

我有道理嗎?

這是我目前有下面的代碼:

RssEntry.includes(:RssItem).where("rss_items.rss_id in (?) AND (rss_entries.id < ? OR rss_entries.created_at > ?)", rssids, lid, time).order("rss_entries.id DESC").limit(16) 

lid = last lowest id from those records 
rssids = ids from where to get the records 
time = last time it did the records call 

上面的代碼僅僅是個開始。我現在需要幫助以確保它符合我上面的要求。

更新1

好了,我能夠做到我想要的東西,但在2個SQL查詢。我真的不認爲有可能在一個SQL查詢中執行我想要的操作。

任何幫助,非常感謝。

謝謝。

+0

它甚至可以在我的需求在一個SQL查詢?或者我必須在兩個查詢中做到這一點? –

回答

3

首先,使用範圍來得到你想要的東西:

class RssEntry < ActiveRecord::Base 
    scope :with_items, includes(:RssItem) 
    scope :newer_first, order("rss_entries.created_at DESC") 

    def self.in(args) 
    where(id: args) 
    end 

    def self.since(time) 
    where('rss_entries.created_at > ?', time) 
    end 
end 

然後

RssEntry.with_items.in(rssids).since(time).offset(lid).limit(16).newer_first 

應該按預期工作。

+0

當我這樣做,我得到以下錯誤:未定義的方法'在'爲#

+3

我相信這些應該被定義爲類方法(即'def self.in(args)''和'def self.from(time)') – PinnyM

+0

好的,我在函數中添加了self.in和self.from。現在我得到這個錯誤:SQLite3 :: SQLException:接近「0」:語法錯誤:SELECT「rss_entries」。* FROM 0 WHERE「rss_entries」。「id」IN(3,4)ORDER BY rss_entries.created_at DESC LIMIT 16 OFFSET 0 –