mysql查询每个id的前10条数据_解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据...
我們都知道,各種主流的社交應用或者閱讀應用,基本都有列表類視圖,并且都有滑到底部加載更多這一功能, 對應后端就是分頁拉取數據。
好處不言而喻,一般來說,這些數據項都是按時間倒序排列的,用戶只關心最新的動態,而不關心幾個月甚至幾年前消息,所以后端返回給客戶端的數據是不會一次性傳遞全部內容的(不僅耗費流量,而且還給服務器帶來巨大壓力)。
舉個例就說MySQL,它已經給我們提供了相應的語句來支持這一功能,那就是limit關鍵字。
比如我要拉取一個消息表中用戶id為1的前10條最新數據,SQL語句如下:
select uid, content, time
from message
where uid = 1
order by time desc
limit 0, 10
1
2
3
4
5
其中,message是表名,查詢3個字段uid,content(消息詳情內容),time(消息發送時間),用order by time desc對數據進行時間倒序排序,一般time的數據類型可以用datetime(格式:yyyy-MM-dd HH:mm:ss)。
然后limit 0, 10表示將查詢結果限制在從下標為0開始的10行數據。
比如你只查詢第8行這一行數據,就是limit 7, 1,形式化描述就是:
limit [index], [count]
順理成章地,我們會自然想到,當用戶加載更多時,我們就將上述SQL語句改為:
select uid, content, time
from message
where uid = 1
order by time desc
limit 10, 10
1
2
3
4
5
09行數據我們已經查詢過了,接下來就是查詢1019行數據,以此類推。
所以,實際的服務端Web程序中,我們可以在編程時把index這個值作為變量,每次加載更多時,就改變index為列表數據項的大小,描述為:
index = listSize
每加載一次新數據,listSize就會增大,下一次查詢從index = listSize這個位置開始即可。
MySQL分頁就搞定了,但是在實際應用中,我們不得不面臨一個數據重復的問題。
舉個例子,我第一頁有10條數據,在加載第二頁新10條數據時,正好總表里增加了n條新數據,這樣第二頁的前n條數據就會與第一頁的后n條數據重復。
如果正確理解這個意思,那么大家就明白當這個n=10時,第二頁數據就會和已經加載的第一頁數據完全一樣。
然而第一頁數據已經在客戶端UI填充完畢了,我們不可能回頭重查,這不僅影響程序效率,而且用戶體驗也很不好。
為了避免這個問題,我們利用時間來控制查詢結果。第1頁到第n頁的分頁數據,其實都是在某個時間點之前的內容,這個時間點之后新插入的數據我們不管。
所以,SQL語句改為:
select uid, content, time
from message
where uid = 1 and time < time_point
order by time desc
limit listSize, 10
1
2
3
4
5
這個time_point在拉取第一頁數據之前就要確定下來,并且和listSize一樣,都是服務端程序代碼中的變量,此處只是個形式化描述。
當前時間可以通過相應的代碼來獲取系統時間(比如Java中的Calendar或者Date類),也可以直接通過SQL語句的now函數獲取系統時間:
select NOW()
1
查詢結果為(這是我此時寫文的時間):
‘2017-01-19 16:07:46’
所以,time_point實際上也就是形如上的一個時間字符串而已,在MySQL中,時間字符串是可以直接比較大小的。
如果你不喜歡字符串比較或者有其它特殊需求,那么你可以將MySQL中的datetime數據類型轉換為整數,這樣寫:
……
where uid = 1 and (time + 0) < time_point_integer
……
1
2
3
datetime通過加0處理后,會轉化為形如20170119160746這樣的長整型,所以時間點變量也不能是字符串了,而是經過處理后的整數(在Java中對應long數據類型)。
剛才的時間查詢語句即改為:
select NOW() + 0
1
轉換成整數有什么好處呢?
比如說,有需求不是定量的分頁拉取,而是按時間段拉取,若我需要過去2小時內的數據,就可以通過整數之間的運算來實現,這里不作贅述。
最后的處理:
time_point和listSize這兩個變量肯定是需要重置的。
那就是在用戶回到列表頂部重新刷新整個列表時,時間點就需要刷新,listSize置為零。
在實際應用中,當用戶還在慢慢向下瀏覽過去的數據時,其實已經有大量新數據已經插入數據庫了,正如上文提到的,這時肯定不能立即加載,所以人性化的處理就是,在適當的地方給予用戶提示,比如“有n條新動態,點擊查看”,用戶點擊后,就會回到頂部,刷新相應的變量,重新加載整個列表。
---------------------
作者:針葉
來源:CSDN
原文:https://blog.csdn.net/ysy950803/article/details/54617223
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
我們都知道,各種主流的社交應用或者閱讀應用,基本都有列表類視圖,并且都有滑到底部加載更多這一功能, 對應后端就是分頁拉取數據。
好處不言而喻,一般來說,這些數據項都是按時間倒序排列的,用戶只關心最新的動態,而不關心幾個月甚至幾年前消息,所以后端返回給客戶端的數據是不會一次性傳遞全部內容的(不僅耗費流量,而且還給服務器帶來巨大壓力)。
舉個例就說MySQL,它已經給我們提供了相應的語句來支持這一功能,那就是limit關鍵字。
比如我要拉取一個消息表中用戶id為1的前10條最新數據,SQL語句如下:
select uid, content, time
from message
where uid = 1
order by time desc
limit 0, 10
1
2
3
4
5
其中,message是表名,查詢3個字段uid,content(消息詳情內容),time(消息發送時間),用order by time desc對數據進行時間倒序排序,一般time的數據類型可以用datetime(格式:yyyy-MM-dd HH:mm:ss)。
然后limit 0, 10表示將查詢結果限制在從下標為0開始的10行數據。
比如你只查詢第8行這一行數據,就是limit 7, 1,形式化描述就是:
limit [index], [count]
順理成章地,我們會自然想到,當用戶加載更多時,我們就將上述SQL語句改為:
select uid, content, time
from message
where uid = 1
order by time desc
limit 10, 10
1
2
3
4
5
09行數據我們已經查詢過了,接下來就是查詢1019行數據,以此類推。
所以,實際的服務端Web程序中,我們可以在編程時把index這個值作為變量,每次加載更多時,就改變index為列表數據項的大小,描述為:
index = listSize
每加載一次新數據,listSize就會增大,下一次查詢從index = listSize這個位置開始即可。
MySQL分頁就搞定了,但是在實際應用中,我們不得不面臨一個數據重復的問題。
舉個例子,我第一頁有10條數據,在加載第二頁新10條數據時,正好總表里增加了n條新數據,這樣第二頁的前n條數據就會與第一頁的后n條數據重復。
如果正確理解這個意思,那么大家就明白當這個n=10時,第二頁數據就會和已經加載的第一頁數據完全一樣。
然而第一頁數據已經在客戶端UI填充完畢了,我們不可能回頭重查,這不僅影響程序效率,而且用戶體驗也很不好。
為了避免這個問題,我們利用時間來控制查詢結果。第1頁到第n頁的分頁數據,其實都是在某個時間點之前的內容,這個時間點之后新插入的數據我們不管。
所以,SQL語句改為:
select uid, content, time
from message
where uid = 1 and time < time_point
order by time desc
limit listSize, 10
1
2
3
4
5
這個time_point在拉取第一頁數據之前就要確定下來,并且和listSize一樣,都是服務端程序代碼中的變量,此處只是個形式化描述。
當前時間可以通過相應的代碼來獲取系統時間(比如Java中的Calendar或者Date類),也可以直接通過SQL語句的now函數獲取系統時間:
select NOW()
1
查詢結果為(這是我此時寫文的時間):
‘2017-01-19 16:07:46’
所以,time_point實際上也就是形如上的一個時間字符串而已,在MySQL中,時間字符串是可以直接比較大小的。
如果你不喜歡字符串比較或者有其它特殊需求,那么你可以將MySQL中的datetime數據類型轉換為整數,這樣寫:
……
where uid = 1 and (time + 0) < time_point_integer
……
1
2
3
datetime通過加0處理后,會轉化為形如20170119160746這樣的長整型,所以時間點變量也不能是字符串了,而是經過處理后的整數(在Java中對應long數據類型)。
剛才的時間查詢語句即改為:
select NOW() + 0
1
轉換成整數有什么好處呢?
比如說,有需求不是定量的分頁拉取,而是按時間段拉取,若我需要過去2小時內的數據,就可以通過整數之間的運算來實現,這里不作贅述。
最后的處理:
time_point和listSize這兩個變量肯定是需要重置的。
那就是在用戶回到列表頂部重新刷新整個列表時,時間點就需要刷新,listSize置為零。
在實際應用中,當用戶還在慢慢向下瀏覽過去的數據時,其實已經有大量新數據已經插入數據庫了,正如上文提到的,這時肯定不能立即加載,所以人性化的處理就是,在適當的地方給予用戶提示,比如“有n條新動態,點擊查看”,用戶點擊后,就會回到頂部,刷新相應的變量,重新加載整個列表。
---------------------
作者:針葉
來源:CSDN
原文:https://blog.csdn.net/ysy950803/article/details/54617223
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
總結
以上是生活随笔為你收集整理的mysql查询每个id的前10条数据_解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis 取查询值_MyBatis
- 下一篇: 优酷html5视频网站,国内主要视频网站