成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一對(duì)多分頁的SQL到底應(yīng)該怎么寫?

數(shù)據(jù)庫 MySQL
MySQL一對(duì)多的數(shù)據(jù)分頁是非常常見的需求,比如我們要查詢商品和商品的圖片信息。但是很多人會(huì)在這里遇到分頁的誤區(qū),得到不正確的結(jié)果。今天就來分析并解決這個(gè)問題。

前言

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

2. 問題分析

我們先創(chuàng)建一個(gè)簡單商品表和對(duì)應(yīng)的商品圖片關(guān)系表,它們之間是一對(duì)多的關(guān)系:

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

 

  1. SELECT P.PRODUCT_ID, P.PROD_NAME, PI.IMAGE_URL 
  2. FROM PRODUCT_INFO P 
  3.          LEFT JOIN PRODUCT_IMAGE PI 
  4.                    ON P.PRODUCT_ID = PI.PRODUCT_ID 

 

 

 

按照傳統(tǒng)的思維我們的分頁語句會(huì)這么寫:

  1. <resultMap id="ProductDTO" type="cn.felord.mybatis.entity.ProductDTO"
  2.     <id property="productId" column="product_id"/> 
  3.     <result property="prodName" column="prod_name"/> 
  4.     <collection property="imageUrls"  ofType="string"
  5.         <result column="image_url"/> 
  6.     </collection> 
  7. </resultMap> 
  8.  
  9. <select id="page" resultMap="ProductDTO"
  10.     SELECT P.PRODUCT_ID, P.PROD_NAME,PI.IMAGE_URL 
  11.     FROM PRODUCT_INFO P 
  12.              LEFT JOIN PRODUCT_IMAGE PI 
  13.                        ON P.PRODUCT_ID = PI.PRODUCT_ID 
  14.     LIMIT #{current},#{size
  15. </select>     

當(dāng)我按照預(yù)想傳入了(0,2)想拿到前兩個(gè)產(chǎn)品的數(shù)據(jù),結(jié)果并不是我期望的:

 

  1. 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 ?,?  
  2. 2020-06-21 23:35:54.541 DEBUG 10980 --- [main] c.f.m.mappers.ProductInfoMapper.page     : ==> Parameters: 0(Long), 2(Long) 
  3. 2020-06-21 23:35:54.565 DEBUG 10980 --- [main] c.f.m.mappers.ProductInfoMapper.page     : <==      Total: 2 
  4. page = [ProductDTO{productId=1, prodName='杯子', imageUrls=[http://asset.felord.cn/cup1.png, http://asset.felord.cn/cup2.png]}] 

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

3. 正確的方式

正確的思路是應(yīng)該先對(duì)主表進(jìn)行分頁,再關(guān)聯(lián)從表進(jìn)行查詢。

拋開框架,我們的SQL應(yīng)該先對(duì)產(chǎn)品表進(jìn)行分頁查詢?nèi)缓笤僮箨P(guān)聯(lián)圖片表進(jìn)行查詢:

 

  1. SELECT P.PRODUCT_ID, P.PROD_NAME, PI.IMAGE_URL 
  2. FROM (SELECT PRODUCT_ID, PROD_NAME 
  3.       FROM PRODUCT_INFO 
  4.       LIMIT #{current},#{size}) P 
  5.          LEFT JOIN PRODUCT_IMAGE PI 
  6.                    ON P.PRODUCT_ID = PI.PRODUCT_ID 

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

  1. <resultMap id="ProductDTO" type="cn.felord.mybatis.entity.ProductDTO"
  2.     <id property="productId" column="product_id"/> 
  3.     <result property="prodName" column="prod_name"/> 
  4.      <!-- 利用 collection 標(biāo)簽提供的 select 特性 和 column   --> 
  5.     <collection property="imageUrls" ofType="string" select="selectImagesByProductId" column="product_id"/> 
  6. </resultMap> 
  7. <!-- 先查詢主表的分頁數(shù)據(jù)    --> 
  8. <select id="page" resultMap="ProductDTO"
  9.     SELECT PRODUCT_ID, PROD_NAME 
  10.     FROM PRODUCT_INFO 
  11.     LIMIT #{current},#{size
  12. </select
  13. <!--根據(jù)productId 查詢對(duì)應(yīng)的圖片--> 
  14. <select id="selectImagesByProductId" resultType="string"
  15.     SELECT IMAGE_URL 
  16.     FROM PRODUCT_IMAGE 
  17.     WHERE PRODUCT_ID = #{productId} 
  18. </select

4. 總結(jié)

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

責(zé)任編輯:未麗燕 來源: segmentfault.com
相關(guān)推薦

2022-02-18 11:05:25

Jpa配置Address

2021-03-04 09:11:57

日志開發(fā)打印

2009-06-04 16:14:22

Hibernate一對(duì)Hibernate一對(duì)Hibernate多對(duì)

2010-07-07 08:33:09

SQL Server學(xué)

2009-09-22 09:55:58

Hibernate實(shí)例

2009-06-04 10:34:19

Hibernate一對(duì)一對(duì)多關(guān)系配置

2010-04-15 09:09:02

Hibernate

2009-06-03 16:27:27

Hibernate一對(duì)一關(guān)系

2009-07-21 17:31:39

iBATIS一對(duì)多映射

2009-08-17 10:34:51

NHibernate一

2012-03-21 11:43:41

JavaHibernate

2023-03-27 08:03:26

Git代碼控制層

2009-09-23 10:37:50

Hibernate一對(duì)

2009-06-26 10:15:54

面試HR

2020-09-17 14:20:24

數(shù)據(jù)科學(xué)簡歷崗位

2020-09-15 12:59:48

KotlinFlutter移動(dòng)

2009-06-03 16:18:16

Hibernate關(guān)系代碼實(shí)例

2009-09-23 10:57:02

Hibernate一對(duì)

2010-09-03 15:08:03

SQLselect語句

2019-05-12 14:10:07

物聯(lián)網(wǎng)DDOS網(wǎng)絡(luò)攻擊
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 午夜激情一区 | 999国产精品视频免费 | 在线播放国产一区二区三区 | 成人精品在线视频 | 精品国产不卡一区二区三区 | 国产日韩欧美 | 91久久国产 | 久久精品一区二区三区四区 | 97超碰中文网 | 中文字幕日韩欧美 | 国产一级片在线观看视频 | 亚洲成人福利在线观看 | 国产乱码精品1区2区3区 | 亚洲欧美一区二区三区国产精品 | 国产欧美一区二区三区国产幕精品 | www.日韩在线 | 精品欧美一区二区三区久久久 | 欧美一二三四成人免费视频 | 99久久电影 | 久久精品小视频 | 九九精品网| 久久成人一区二区三区 | 国产精品一区二区三区在线 | 国产粉嫩尤物极品99综合精品 | 国产精品毛片无码 | 精品欧美一区二区三区久久久 | 成人在线视频一区二区三区 | 欧美一区视频 | 日韩成人av在线播放 | 亚洲福利一区 | 日韩精品一区二区三区 | 国产成人精品免高潮在线观看 | 国产精品日日做人人爱 | 成人在线视频免费观看 | 亚洲国产aⅴ精品一区二区 免费观看av | 国产在线精品一区二区三区 | 国产精品久久免费观看 | 99影视| 欧美成人不卡 | 国产传媒毛片精品视频第一次 | 日韩在线中文字幕 |