欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

一對多分頁的SQL應(yīng)該怎么寫

本篇文章為大家展示了一對多分頁的SQL應(yīng)該怎么寫,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站、網(wǎng)站重做改版、韓城網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站成都商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為韓城等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

前言

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

2. 問題分析

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

一對多分頁的SQL應(yīng)該怎么寫

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

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

一對多分頁的SQL應(yīng)該怎么寫

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

<resultMap id="ProductDTO" type="cn.felord.mybatis.entity.ProductDTO">     <id property="productId" column="product_id"/>     <result property="prodName" column="prod_name"/>     <collection property="imageUrls"  ofType="string">         <result column="image_url"/>     </collection> </resultMap>  <select id="page" resultMap="ProductDTO">     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} </select>

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

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]}]

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

3. 正確的方式

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

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

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提供了一個相對優(yōu)雅的路子,思路依然是開頭所說的思路。只不過我們需要改造上面的Mybatis  XML配置:

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

大部分情況下分頁是很容易的,但是一對多還是有一些小小的陷阱的。一旦我們了解了其中的機制,也并不難解決。

上述內(nèi)容就是一對多分頁的SQL應(yīng)該怎么寫,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

新聞標(biāo)題:一對多分頁的SQL應(yīng)該怎么寫
網(wǎng)頁路徑:http://www.chinadenli.net/article22/pieejc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站網(wǎng)站維護企業(yè)網(wǎng)站制作手機網(wǎng)站建設(shè)電子商務(wù)網(wǎng)站設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計