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到底应该怎么写?相关推荐

  1. Dapper 分页查询MySQL

    在.Net中使用dapper 分页查询mysql中的表,报错:Error parsing column 8 错误原因:错误信息中的列8,内容为null,在数据库中的字段类型为char(36) 解决办法 ...

  2. db2分页查询语句优化_面试官:数据量很大,分页查询很慢,怎么优化?

    当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点. 下面简单说一下我知道的一些 ...

  3. db2分页查询语句优化_数据量很大,分页查询很慢,该怎么优化?

    点击上方"服务端思维",选择"设为星标" 回复"669"获取独家整理的精选资料集 回复"加群"加入全国服务端高端社群「后 ...

  4. mybatis一对多关联查询_Mybatis 一对一、一对多的关联查询 ?

    <mapper namespace="com.lcb.mapping.userMapper"> <!--association 一对一关联查询 --> &l ...

  5. MySQL_(Java)分页查询MySQL中的数据

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL_(Java)使用preparestatement ...

  6. php超大树形分页,PHP+MySql千万级数据limit分页优化方案

    PHP+MySql千万级数据limit分页优化方案 1年前 阅读 2750 评论 0 喜欢 0 ### 原因 徒弟突然有个需求,就是他发现limit分页,页数越大之后,mysql的消耗越大,查询时间越 ...

  7. oracle spring 分页查询,SpringJDBC 调用oracle 通用存储过程分页

    我博客前面有写道SpringJDBC调用通用的Oracle存储过程,今天来讲一下通用的Java存储过程带分页的功能,其中里面还有动态查询的SQL拼接,好的,先上代码 1.Java代码 @Autowir ...

  8. NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045

    然后我们来看,如何从mysql中,进行分页获取数据,然后把数据导入到hbase中去,这里 刚开始是通过phoenix,想通过phoenix来操作hbase, 但是弄了好久啊...报错...不知道为什么 ...

  9. 查询mysql数量_科研学习记录--MySQL

    一.MySQL简介 MySQL是一个轻量级的关系型数据库管理系统,使用C/C++编写,支持多种操作系统. 二.MySQL逻辑架构 MySQL逻辑架构为三层结构:客户端-核心服务-存储引擎. MySQL ...

最新文章

  1. ActiveMQ依赖JDK版本关系
  2. asp.net中读取带有加号(+)的Cookie,会自动把加号替换为空格
  3. 一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事
  4. 《JAVA 语言程序设计基础篇》chapter 5 方法
  5. 用c#转换word或excel文档为html文件,C#实现DataSet内数据转化为Excel和Word文件的通用类完整实例...
  6. 校准 Linux 服务器的时间
  7. 复旦大学数学学院高等代数历届期中考试大题精选之一(08级--12级)
  8. 小步快跑 快速迭代(整理)
  9. 15款超好用的短链接在线生成器(新浪t.cn、腾讯url.cn)
  10. Springboot - Ambiguous handler methods mapped
  11. c语言人民日报排版的代码,人民日报都在玩的排版黑科技,教你1分钟上手!
  12. 如何用数据分析的概念制作简单Excel报表?
  13. Vue 使用阿里图标库代替element icon
  14. 本地存储localStorage的用法总结
  15. 摄像头常用接口MIPI,DVP原理图接口定义
  16. DB2进行压缩的最佳实践
  17. C4D制作lowpoly风格物体
  18. [BLE--SMP]蓝牙安全管理之BLE的安全
  19. python实现自动化抢微信红包功能_【Python】用Python实现微信自动化抢红包,再也不用担心抢不到红包了...
  20. 文件上传——FileItem接口方法

热门文章

  1. thinkphp5 获取当前的域名
  2. linux 共享内存陷井,linux共享内存应用与陷阱
  3. MySQL新建库 添加用户及权限 MySQL的Grant命令
  4. PHP底层运行原理初探
  5. mysql中0和空值_SQL中空值 和NULL的概念:
  6. idea创建文件自定义注释
  7. cad画流程图的插件_流程图控件FlowChart.NET使用教程:安排组件的使用
  8. 关于日志系统显示SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.
  9. python编程神器下载_Python编程神器 -程序员必备开发手册
  10. 使用HTML语言编写HTML教程,HTML教程:HTML编写小经验