一对多分页查询mysql编写_一对多分页的SQL到底应该怎么写?
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到底应该怎么写?相关推荐
- Dapper 分页查询MySQL
在.Net中使用dapper 分页查询mysql中的表,报错:Error parsing column 8 错误原因:错误信息中的列8,内容为null,在数据库中的字段类型为char(36) 解决办法 ...
- db2分页查询语句优化_面试官:数据量很大,分页查询很慢,怎么优化?
当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点. 下面简单说一下我知道的一些 ...
- db2分页查询语句优化_数据量很大,分页查询很慢,该怎么优化?
点击上方"服务端思维",选择"设为星标" 回复"669"获取独家整理的精选资料集 回复"加群"加入全国服务端高端社群「后 ...
- mybatis一对多关联查询_Mybatis 一对一、一对多的关联查询 ?
<mapper namespace="com.lcb.mapping.userMapper"> <!--association 一对一关联查询 --> &l ...
- MySQL_(Java)分页查询MySQL中的数据
MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL_(Java)使用preparestatement ...
- php超大树形分页,PHP+MySql千万级数据limit分页优化方案
PHP+MySql千万级数据limit分页优化方案 1年前 阅读 2750 评论 0 喜欢 0 ### 原因 徒弟突然有个需求,就是他发现limit分页,页数越大之后,mysql的消耗越大,查询时间越 ...
- oracle spring 分页查询,SpringJDBC 调用oracle 通用存储过程分页
我博客前面有写道SpringJDBC调用通用的Oracle存储过程,今天来讲一下通用的Java存储过程带分页的功能,其中里面还有动态查询的SQL拼接,好的,先上代码 1.Java代码 @Autowir ...
- NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
然后我们来看,如何从mysql中,进行分页获取数据,然后把数据导入到hbase中去,这里 刚开始是通过phoenix,想通过phoenix来操作hbase, 但是弄了好久啊...报错...不知道为什么 ...
- 查询mysql数量_科研学习记录--MySQL
一.MySQL简介 MySQL是一个轻量级的关系型数据库管理系统,使用C/C++编写,支持多种操作系统. 二.MySQL逻辑架构 MySQL逻辑架构为三层结构:客户端-核心服务-存储引擎. MySQL ...
最新文章
- ActiveMQ依赖JDK版本关系
- asp.net中读取带有加号(+)的Cookie,会自动把加号替换为空格
- 一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事
- 《JAVA 语言程序设计基础篇》chapter 5 方法
- 用c#转换word或excel文档为html文件,C#实现DataSet内数据转化为Excel和Word文件的通用类完整实例...
- 校准 Linux 服务器的时间
- 复旦大学数学学院高等代数历届期中考试大题精选之一(08级--12级)
- 小步快跑 快速迭代(整理)
- 15款超好用的短链接在线生成器(新浪t.cn、腾讯url.cn)
- Springboot - Ambiguous handler methods mapped
- c语言人民日报排版的代码,人民日报都在玩的排版黑科技,教你1分钟上手!
- 如何用数据分析的概念制作简单Excel报表?
- Vue 使用阿里图标库代替element icon
- 本地存储localStorage的用法总结
- 摄像头常用接口MIPI,DVP原理图接口定义
- DB2进行压缩的最佳实践
- C4D制作lowpoly风格物体
- [BLE--SMP]蓝牙安全管理之BLE的安全
- python实现自动化抢微信红包功能_【Python】用Python实现微信自动化抢红包,再也不用担心抢不到红包了...
- 文件上传——FileItem接口方法
热门文章
- thinkphp5 获取当前的域名
- linux 共享内存陷井,linux共享内存应用与陷阱
- MySQL新建库 添加用户及权限 MySQL的Grant命令
- PHP底层运行原理初探
- mysql中0和空值_SQL中空值 和NULL的概念:
- idea创建文件自定义注释
- cad画流程图的插件_流程图控件FlowChart.NET使用教程:安排组件的使用
- 关于日志系统显示SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.
- python编程神器下载_Python编程神器 -程序员必备开发手册
- 使用HTML语言编写HTML教程,HTML教程:HTML编写小经验