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配置:

总结

大部分情况下分页是很容易的,但是一对多还是有一些小小的陷阱的。一旦我们了解了其中的机制,也并不难解决。当然如果你有更好的解决方案可以留言讨论,集思广益。多多关注:码农小胖哥,获取更多开发技巧。

本文地址:https://www.linuxprobe.com/write-onetomany-sql.html

如何写一对多分页的SQL相关推荐

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

    1. 前言 MySQL一对多的数据分页是非常常见的需求,比如我们要查询商品和商品的图片信息.但是很多人会在这里遇到分页的误区,得到不正确的结果.今天就来分析并解决这个问题. 2. 问题分析 我们先创建 ...

  2. 一对多分页的SQL应该怎么写?

    1. 前言 MySQL一对多的数据分页是非常常见的需求,比如我们要查询商品和商品的图片信息.但是很多人会在这里遇到分页的误区,得到不正确的结果.今天就来分析并解决这个问题. 2. 问题分析 我们先创建 ...

  3. oracle的分页查询怎么写,ORACLE分页查询SQL语法

    ORACLE分页查询SQL语法 --1:无ORDER BY排序的写法.(效率最高) ­ --(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!) ­ S ...

  4. PageHelper在对mybatis一对多分页不正确的问题

    1. 其实这个问题仔细一想也没什么 1.首先使用PageHelper单表没有问题 2.连表查询不牵扯到一对多也没有问题 3.连表查询牵扯到一对多分页错误: 比如:查第一页,查询10条数据,却只得到三条 ...

  5. 在Oracle中写出性能优良的SQL语句

    我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器 ...

  6. mysql关联表分页查询_MySQL一对多分页查询-主表关联表条件查询问题

    文章目录 1 摘要 2 情景复现 2.1 数据模型 2.2 核心代码 2.3 测试数据 2.4 拓展一点 1 摘要 分页查询是后台项目中最常见的一种操作,在一对多(one to many)的关系表中, ...

  7. mybatis mapper 一对多分页查询

    1. 使用级联查询解决一对多分页问题 下面的 mapper 语句为第一个版本,其中还存在一个bug,级联查询没有办法解决带条件的查询问题. <resultMap id="Product ...

  8. pageHelper没有正确分页,sql拼接多加limit等参数。

    pageHelper没有正确分页,sql拼接多加limit等参数. 背景: 日常敲代码,发现用了pageHelper真的方便,尤其是使用了pageInfo这个类,不用自己写工具类了,直接将所有的页码信 ...

  9. SpringBoot Mybatis解决使用PageHelper一对多分页问题

    SpringBoot Mybatis解决使用PageHelper一对多分页问题 参考文章: (1)SpringBoot Mybatis解决使用PageHelper一对多分页问题 (2)https:// ...

最新文章

  1. 巧用组策略关闭危险端口
  2. 【Java】数据结构---二叉树 详解
  3. HTML5无刷新修改URL:利用 History API 无刷新更改地址栏
  4. java.lang.NumberFormatException 错误及解决办法
  5. linux ntptime(Network Time Protocol 网络时间协议)
  6. 【2010福建】收稻子 (校BSOJ1114)
  7. bootstraptable导出excel独立使用_使用 EasyPOI 优雅导出Excel模板数据(含图片)
  8. js页面传值php页面,php实现跳转传值有什么方法,js页面跳转传值
  9. 选择图像根据坐标得到图像。头像裁剪器
  10. OpenCV学习(7) 分水岭算法(1)
  11. Heroku第三方服务接入指南(二)
  12. 积分上下限无穷_数分笔记——5种广义积分敛散性的基本方法
  13. paip.html调试工具--显示控件名称与值
  14. 如何用python刷屏_利用python实现在微信群刷屏的方法
  15. 在线图片编辑器/在线视频剪辑器/网站源码
  16. php华文行楷,css设置中文字体
  17. 【PPT】学术答辩163套模板
  18. ios 画带有箭头的线_iOS 箭头类型视图的几点心得
  19. Spring事务管理的总结
  20. es父子结构查询_探索ES-嵌套对象和父子对象(四)

热门文章

  1. JDL-1002B/AC220V电流继电器
  2. JDL-1220A电流继电器
  3. 在线教育APP带来的价值
  4. 如何利用万用表判断芯片和PCB之间良好焊接及防护二极管作用
  5. access窗体读取html,HTML_ACCESS如何打印窗体中当前显示的记录,问题: 连续或者单个窗 - phpStudy...
  6. 学生党适合什么价位降噪蓝牙耳机?高颜值游戏专属蓝牙耳机
  7. MKVToolNix v61.0.0 专业MKV视频封装制作软件便携版
  8. 单片机c语言字符串赋值,单片机C语言中数组的用法
  9. SpringData JPA中@OneToMany和@ManyToOne的用法详解
  10. python批量替换app多国语言翻译字符串