鍍金池/ 問答/PHP  數(shù)據(jù)庫/ mysql 如何分批 讀取數(shù)據(jù)

mysql 如何分批 讀取數(shù)據(jù)

情景是數(shù)據(jù)庫里有一系列的post(新聞類),現(xiàn)在想根據(jù)post表中有的post_date(時間),view(瀏覽數(shù)量),或者post_like表的likeCount進行排序,并分批讀取數(shù)據(jù),limit在25

比如說post_date:

SELECT post.*, user.user_avatar, user.user_name,

        (SELECT COUNT(*) FROM comment
        WHERE comment.post_id = post.post_id) AS commentCount,
        (SELECT COUNT(*) FROM post_like
        WHERE post_like.post_id = post.post_id) AS likeCount
  FROM post, user where post.user_id=user.user_id and post.post_date < "2018-04-05 12:12:35"  order by post.post_date desc limit 25
  

這里post_date可以抓取最后一條的post_date用來做下次獲取的標記值。

但是問題是:如果我想通過view或者likeCount排序分批讀取數(shù)據(jù),獲取的數(shù)據(jù)中沒有可以用來做標記,拿來進行下次對比的標記值。

mysql語句如下:

SELECT post.*, user.user_avatar, user.user_name,

        (SELECT COUNT(*) FROM comment
        WHERE comment.post_id = post.post_id) AS commentCount,
        (SELECT COUNT(*) FROM post_like
        WHERE post_like.post_id = post.post_id) AS likeCount
  FROM post, user where post.user_id=user.user_id  order by likeCount desc limit 25
  

大家一般都是怎么解決的?謝謝

回答
編輯回答
舊言

limit n,m,表示起始值為n,然后取出m個記錄。如果batch size為25,那么可以:
limit 25,limit 25,25,limit50,25 ... 依次下去,默認按照表的主鍵id升序排列,每次記錄最大的已處理記錄的主鍵id(這里基于了一個假設,此表是自增主鍵)

如果此表沒有新增記錄,以上方法肯定沒問題,但是如果此表有多個事務并發(fā)寫入,可能會導致大id記錄先于小id記錄(兩個事務)被處理,導致這部分小id記錄永遠也不會被處理到。

問題中使用post_date其實也會有這個問題,無法保證post_date小的數(shù)據(jù)記錄一定先于post_date大的記錄先入庫。insert時間早,id小的記錄并不一定早于id大的記錄插入至數(shù)據(jù)庫。此完全取決于事務的提交時間。

2018年1月7日 18:04
編輯回答
妖妖

列表的分頁怎么實現(xiàn)的,這個就怎么實現(xiàn)。這個思路不會錯

2017年1月31日 04:46
編輯回答
小眼睛

比如總共有110條數(shù)據(jù),分頁每頁25條,那總共有5頁。頁面開始顯示的是 select from post order by view desc limit 0,25獲得的數(shù)據(jù)。頁面上滑的時候加載第二頁select from post order by view desc limit 25,25。加載更多的時候把limit第一個參數(shù)計算好應該就可以了。已經測試過了,是可以的。

2017年4月29日 06:09