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

歡迎訪問 生活随笔!

生活随笔

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

数据库

一对多分页查询mysql编写_一对多分页的SQL到底应该怎么写?

發布時間:2024/9/15 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一对多分页查询mysql编写_一对多分页的SQL到底应该怎么写? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 前言

MySQL一對多的數據分頁是非常常見的需求,比如我們要查詢商品和商品的圖片信息。但是很多人會在這里遇到分頁的誤區,得到不正確的結果。今天就來分析并解決這個問題。

2. 問題分析

我們先創建一個簡單商品表和對應的商品圖片關系表,它們之間是一對多的關系:

然后我分別寫入了一些商品和這些商品對應的圖片,通過下面的左連接查詢可以看出它們之間具有明顯的一對多關系:

SELECT P.PRODUCT_ID, P.PROD_NAME, PI.IMAGE_URL

FROM PRODUCT_INFO P

LEFT JOIN PRODUCT_IMAGE PI

ON P.PRODUCT_ID = PI.PRODUCT_ID

按照傳統的思維我們的分頁語句會這么寫:

SELECT P.PRODUCT_ID, P.PROD_NAME,PI.IMAGE_URL

FROM PRODUCT_INFO P

LEFT JOIN PRODUCT_IMAGE PI

ON P.PRODUCT_ID = PI.PRODUCT_ID

LIMIT #{current},#{size}

當我按照預想傳入了(0,2)想拿到前兩個產品的數據,結果并不是我期望的:

2020-06-21 23:35:54.515 DEBUG 10980 --- [main] c.f.m.mappers.ProductInfoMapper.page : ==> Preparing: SELECT P.PRODUCT_ID, P.PROD_NAME,PI.IMAGE_URL FROM PRODUCT_INFO P LEFT JOIN PRODUCT_IMAGE PI ON P.PRODUCT_ID = PI.PRODUCT_ID limit ?,?

2020-06-21 23:35:54.541 DEBUG 10980 --- [main] c.f.m.mappers.ProductInfoMapper.page : ==> Parameters: 0(Long), 2(Long)

2020-06-21 23:35:54.565 DEBUG 10980 --- [main] c.f.m.mappers.ProductInfoMapper.page : <== Total: 2

page = [ProductDTO{productId=1, prodName='杯子', imageUrls=[http://asset.felord.cn/cup1.png, http://asset.felord.cn/cup2.png]}]

我期望的兩條數據是杯子和筆記本,但是結果卻只有一條。原來當一對多映射時結果集會按照多的一側進行輸出(期望4條數據,實際上會有7條),而前兩條展示的只會是杯子的數據(如上圖),合并后就只有一條結果了,這樣分頁就對不上了。那么如何才能達到我們期望的分頁效果呢?

3. 正確的方式

正確的思路是應該先對主表進行分頁,再關聯從表進行查詢。

拋開框架,我們的SQL應該先對產品表進行分頁查詢然后再左關聯圖片表進行查詢:

SELECT P.PRODUCT_ID, P.PROD_NAME, PI.IMAGE_URL

FROM (SELECT PRODUCT_ID, PROD_NAME

FROM PRODUCT_INFO

LIMIT #{current},#{size}) P

LEFT JOIN PRODUCT_IMAGE PI

ON P.PRODUCT_ID = PI.PRODUCT_ID

這種寫法的好處就是通用性強一些。但是MyBatis提供了一個相對優雅的路子,思路依然是開頭所說的思路。只不過我們需要改造上面的Mybatis XML配置:

SELECT PRODUCT_ID, PROD_NAME

FROM PRODUCT_INFO

LIMIT #{current},#{size}

SELECT IMAGE_URL

FROM PRODUCT_IMAGE

WHERE PRODUCT_ID = #{productId}

4. 總結

大部分情況下分頁是很容易的,但是一對多還是有一些小小的陷阱的。一旦我們了解了其中的機制,也并不難解決。當然如果你有更好的解決方案可以留言討論,集思廣益。多多關注:碼農小胖哥,獲取更多開發技巧。

關注公眾號:Felordcn 獲取更多資訊

總結

以上是生活随笔為你收集整理的一对多分页查询mysql编写_一对多分页的SQL到底应该怎么写?的全部內容,希望文章能夠幫你解決所遇到的問題。

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