2017-07-17 82 views
1

我想查询的顺序,天行:今天指数由升日期但过去的日期显示最后

  1. 未来
  2. 过去

目前我正在做一个简单的查询是这样的:

getLatest(howMany, offset) { 
    return knex 
     .select('*') 
     .from('event') 
     .orderBy('start_time', 'asc') 
     .offset(offset) 
     .limit(howMany); 
} 

但是问题在于它首先显示过去的时间戳。我知道我可以得到像这样的过去的记录:

knex('event') 
    .select('id') 
    .whereRaw("start_time < NOW()") 

更新:有没有办法使这与偏移工作?每次用户到达底部以获取更多事件时,该查询都会运行无限的提要。索引可能?

这是我的架构:

knex.schema.createTable('event', (table) => { 
    table.increments().primary(); 
    table.dateTime('start_time').notNullable(); 
}) 

回答

2

你不得不使用orderByRaw创建ORDER BY条款像

ORDER BY start_time < current_timestamp, start_time 
+0

有没有一种方法,使与补偿工作的呢?当用户到达底部以获取更多事件时,此查询将运行无限的提要。我感觉这需要某种索引,但我以前从未使用索引。 –

+1

@VladyVeselinov每一本优化书中都有一个关于限制/偏移量的特殊章节。这个主题是一个很好的[slideshare](https://www.slideshare.net/MarkusWinand/p2d2-pagination-done-the-postgresql-way)。 但是对于我来说,我觉得这就像是“上级”的先进水平。对于小型项目(低于千兆字节/兆字节的数据) - 极限/偏移量工作得很好。 另外,postgres中有一个'current_date'。 'current_timestamp'返回当前时间,'current_date' - 当天的开始时间。 – coockoo

+0

我同意@coockoo写的大部分内容,除了我认为索引和键集分页是每个开发人员都应该理解的内容。由于这个查询只是在一个表上,而数据库是PostgreSQL,所以你应该试试看。唯一的困难是表达式'start_time