[英]Create API endpoint for fetching dynamic data based on time
我有一個刮刀,定期從新聞網站上抓取文章並將它們存儲在數據庫[MYSQL]中。 刮擦的工作方式是先將最舊的物品刮掉,然后再轉到更近期的文章。
例如 ,在1月1日寫的文章將首先被刪除並給出ID 1,並且在1月2日被刪除的文章將具有ID 2 。
因此,與舊文章相比,最近的文章將具有更高的ID。
有多個刮刀同時運行。
現在我需要一個端點,我可以根據文章的時間戳查詢,每次獲取時我也有10篇文章的限制。
例如,當有20篇文章以時間戳1499241705發布時,當我查詢時間戳為1499241705的終點時, 會出現問題,我會檢查所有文章> = 1499241705,在這種情況下,我總會得到每次相同的10篇文章,將條件改為a >意味着我會跳過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子句發送。
例如$this->db->where('unix_timestamp <=', $timestamp); $this->db->where('id <', $offset); $this->db->order_by('unix_timestamp ', 'DESC'); $this->db->order_by('id', 'DESC');
$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時。因此數據將丟失。
兩部分:時間戳和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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.