2017-07-17 79 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