日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql查询每个id的前10条数据_解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据...

發布時間:2025/3/12 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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条最新数据...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。