2017-07-05 15 views
4

我有一個刮板,它定期從新聞網站上抓取文章並將它們存儲在數據庫[MYSQL]中。 刮削工程的方式是最古老的物品首先被刮掉,然後移動到更近的物品上。根據時間創建用於獲取動態數據的API端點

例如被寫入時間Jan的第一物品會被刮掉第一和給予ID 1並且對所1月2日的刮下的製品將具有ID 2

所以最近的文章與舊文章相比會有更高的ID。

有多個鏟運機同時運行。

現在我需要一個端點,我可以根據文章的時間戳進行查詢,並且每次獲取都有10篇文章的限制。

的問題出現,例如當有20篇它被張貼與時間戳,當我查詢端點的時間戳進行檢查,給我所有的文章,是> = 1499241705在這種情況下,我總是會每次獲得相同的10篇文章,將條件更改爲>意味着我跳過11-20的文章。添加另一個where子句以檢查id不成功,因爲刮刀同時運行時可能無法始終以正確的日期順序插入文章。

有沒有一種方法可以查詢這個結束點,所以我總是可以從它得到一致的數據與最新的文章第一次,然後是舊的文章。

編輯:

+-----------------------+ 
    | id | unix_timestamp | 
    +-----------------------+ 
    | 1 | 1000   | 
    | 2 | 1001   | 
    | 3 | 1002   | 
    | 4 | 1003   | 
    | 11 | 1000   | 
    | 12 | 1001   | 
    | 13 | 1002   | 
    | 14 | 1003   | 
    +-----------------------+ 

最後的時間戳和ID正在通過WHERE子句發送。

E.g. $this->db->where('unix_timestamp <=', $timestamp); $this->db->where('id <', $offset); $this->db->order_by('unix_timestamp ', 'DESC'); $this->db->order_by('id', 'DESC');

查詢時間戳爲1003時,會提取ID 14和4。但是在接下來的調用中,id 4就是偏移量,因此不會獲取id 13,而只會在下次訪問id 3時丟失數據。

+0

你在你的數據庫副本的文章,如果是,首先解決這個問題。 – urfusion

+0

沒有重複的文章只是可能在同一時間發佈的文章。 –

+1

你爲什麼不按ID來訂購? –

回答

2

兩部分:時間戳和ID。

WHERE timestamp <= $ts_leftoff 
    AND (timestamp < $ts_leftoff 
      OR id <= $id_leftoff) 
ORDER BY (timestamp DESC, id DESC) 

因此,假設id是獨一無二的,它不會,如果大量的行具有相同的timestamp關係,順序是完全確定性。

有這個語法,但遺憾的是它沒有很好地優化:

WHERE (timestamp, id) <= ($ts_leftoff, $id_leftoff) 

所以,我建議不要使用它。

更多的「不放過」的概念:http://mysql.rjweb.org/doc.php/pagination

+0

id是唯一的,但可能不在序列中,因此可能會跳過數據,如問題中的示例所示,這是否可以解決該問題? –

+0

我假設'id'是'AUTO_INCREMENT'。如果你可以按順序插入行(不符合時間戳順序,那就是),那麼這個問題真的很討厭。我認爲解決方案是告訴用戶「最近幾秒到達的物品可能尚未存入數據庫中」,「您只能看到我們已經刮過的消息;稍後再回來查看更多」。也就是說,爲代碼的工作設置足夠低的預期。 –

+0

我做過新聞報道;我認爲所謂的問題並不嚴重。 –

相關問題