如何寫一對多分頁的SQL
導讀 | MySQL一對多的資料分頁是非常常見的需求,比如我們要查詢商品和商品的圖片資訊。但是很多人會在這裡遇到分頁的誤區,得到不正確的結果。今天就來分析並解決這個問題。 |
MySQL一對多的資料分頁是非常常見的需求,比如我們要查詢商品和商品的圖片資訊。但是很多人會在這裡遇到分頁的誤區,得到不正確的結果。今天就來分析並解決這個問題。
我們先建立一個簡單商品表和對應的商品圖片關係表,它們之間是一對多的關係:
然後我分別寫入了一些商品和這些商品對應的圖片,透過下面的左連線查詢可以看出它們之間具有明顯的一對多關係:
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
按照傳統的思維我們的分頁語句會這麼寫:
當我按照預想傳入了(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條),而前兩條展示的只會是杯子的資料(如上圖),合併後就只有一條結果了,這樣分頁就對不上了。那麼如何才能達到我們期望的分頁效果呢?
正確的思路是應該先對主表進行分頁,再關聯從表進行查詢。
拋開框架,我們的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配置:
大部分情況下分頁是很容易的,但是一對多還是有一些小小的陷阱的。一旦我們瞭解了其中的機制,也並不難解決。當然如果你有更好的解決方案可以留言討論,集思廣益。多多關注:碼農小胖哥,獲取更多開發技巧。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2706341/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一對多分頁的SQL到底應該怎麼寫?SQL
- 解決 mybatis一對多分頁問題 聯級查詢MyBatis
- 如何寫一個簡單的分頁元件(原理)元件
- 教你如何寫第一個jsp頁面JS
- MaxCompute如何對SQL查詢結果實現分頁獲取SQL
- django | 常見 SQL 及其對應的 ORM 寫法DjangoSQLORM
- 如何寫出更快的 SQL (db2)SQLDB2
- 如何寫好 5000 行的 SQL 程式碼SQL
- 如何寫好5000行的SQL程式碼SQL
- 請問如何定位一個用 Laya 寫的 Webview 頁面的元素?WebView
- 如何寫出高效能SQLSQL
- 一種提升SQL改寫效率的方法SQL
- 如何編寫翻頁函式?函式
- 寫一個網頁點選的特效網頁特效
- 統計分頁一些sqlSQL
- sql devloper 用法的和SQL 編寫SQLdev
- 如何分析一條sql的效能SQL
- 測試多分支開發對合並程式碼的影響
- 最佳實踐|如何寫出簡單高效的 Flink SQL?SQL
- jstl 寫的分頁JS
- 如何用手機測試自己寫的web頁面Web
- if 多分支語句和 switch 多分支語句的異同之處
- 教你如何使用PyTorch解決多分類問題PyTorch
- 書寫高質量sql的一些建議SQL
- 如何在PL/SQL中讀寫檔案(轉)SQL
- Spark SQL:4.對Spark SQL的理解SparkSQL
- 列印網頁的時候,如何讓指定的元素另起一頁(列印分頁)?網頁
- 寫一個獲取頁面中所有checkbox的方法
- 使用Vue寫一個登入頁面Vue
- 用Flutter 寫一個簡單頁面Flutter
- 用SwiftUI寫一個簡單頁面SwiftUI
- 01-使用html寫一個網頁HTML網頁
- 一次SQL調優 聊一聊 SQLSERVER 資料頁SQLServer
- SQL Server資料庫中分頁編號的另一種方式SQLServer資料庫
- MySQL的SQL等價改寫MySql
- 反對SQL與捍衛SQL的論戰SQL
- 如何寫一個Vue的外掛Vue
- mysql資料庫全家桶(安裝與如何寫sql,如何使用)MySql資料庫