如何写一对多分页的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配置:
总结
大部分情况下分页是很容易的,但是一对多还是有一些小小的陷阱的。一旦我们了解了其中的机制,也并不难解决。当然如果你有更好的解决方案可以留言讨论,集思广益。多多关注:码农小胖哥,获取更多开发技巧。
本文地址:https://www.linuxprobe.com/write-onetomany-sql.html
如何写一对多分页的SQL相关推荐
- 一对多分页查询mysql编写_一对多分页的SQL到底应该怎么写?
1. 前言 MySQL一对多的数据分页是非常常见的需求,比如我们要查询商品和商品的图片信息.但是很多人会在这里遇到分页的误区,得到不正确的结果.今天就来分析并解决这个问题. 2. 问题分析 我们先创建 ...
- 一对多分页的SQL应该怎么写?
1. 前言 MySQL一对多的数据分页是非常常见的需求,比如我们要查询商品和商品的图片信息.但是很多人会在这里遇到分页的误区,得到不正确的结果.今天就来分析并解决这个问题. 2. 问题分析 我们先创建 ...
- oracle的分页查询怎么写,ORACLE分页查询SQL语法
ORACLE分页查询SQL语法 --1:无ORDER BY排序的写法.(效率最高) --(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!) S ...
- PageHelper在对mybatis一对多分页不正确的问题
1. 其实这个问题仔细一想也没什么 1.首先使用PageHelper单表没有问题 2.连表查询不牵扯到一对多也没有问题 3.连表查询牵扯到一对多分页错误: 比如:查第一页,查询10条数据,却只得到三条 ...
- 在Oracle中写出性能优良的SQL语句
我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器 ...
- mysql关联表分页查询_MySQL一对多分页查询-主表关联表条件查询问题
文章目录 1 摘要 2 情景复现 2.1 数据模型 2.2 核心代码 2.3 测试数据 2.4 拓展一点 1 摘要 分页查询是后台项目中最常见的一种操作,在一对多(one to many)的关系表中, ...
- mybatis mapper 一对多分页查询
1. 使用级联查询解决一对多分页问题 下面的 mapper 语句为第一个版本,其中还存在一个bug,级联查询没有办法解决带条件的查询问题. <resultMap id="Product ...
- pageHelper没有正确分页,sql拼接多加limit等参数。
pageHelper没有正确分页,sql拼接多加limit等参数. 背景: 日常敲代码,发现用了pageHelper真的方便,尤其是使用了pageInfo这个类,不用自己写工具类了,直接将所有的页码信 ...
- SpringBoot Mybatis解决使用PageHelper一对多分页问题
SpringBoot Mybatis解决使用PageHelper一对多分页问题 参考文章: (1)SpringBoot Mybatis解决使用PageHelper一对多分页问题 (2)https:// ...
最新文章
- 巧用组策略关闭危险端口
- 【Java】数据结构---二叉树 详解
- HTML5无刷新修改URL:利用 History API 无刷新更改地址栏
- java.lang.NumberFormatException 错误及解决办法
- linux ntptime(Network Time Protocol 网络时间协议)
- 【2010福建】收稻子 (校BSOJ1114)
- bootstraptable导出excel独立使用_使用 EasyPOI 优雅导出Excel模板数据(含图片)
- js页面传值php页面,php实现跳转传值有什么方法,js页面跳转传值
- 选择图像根据坐标得到图像。头像裁剪器
- OpenCV学习(7) 分水岭算法(1)
- Heroku第三方服务接入指南(二)
- 积分上下限无穷_数分笔记——5种广义积分敛散性的基本方法
- paip.html调试工具--显示控件名称与值
- 如何用python刷屏_利用python实现在微信群刷屏的方法
- 在线图片编辑器/在线视频剪辑器/网站源码
- php华文行楷,css设置中文字体
- 【PPT】学术答辩163套模板
- ios 画带有箭头的线_iOS 箭头类型视图的几点心得
- Spring事务管理的总结
- es父子结构查询_探索ES-嵌套对象和父子对象(四)
热门文章
- JDL-1002B/AC220V电流继电器
- JDL-1220A电流继电器
- 在线教育APP带来的价值
- 如何利用万用表判断芯片和PCB之间良好焊接及防护二极管作用
- access窗体读取html,HTML_ACCESS如何打印窗体中当前显示的记录,问题: 连续或者单个窗 - phpStudy...
- 学生党适合什么价位降噪蓝牙耳机?高颜值游戏专属蓝牙耳机
- MKVToolNix v61.0.0 专业MKV视频封装制作软件便携版
- 单片机c语言字符串赋值,单片机C语言中数组的用法
- SpringData JPA中@OneToMany和@ManyToOne的用法详解
- python批量替换app多国语言翻译字符串