2013-01-12 39 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 –