返回顶部
首页 > 资讯 > 数据库 >一对多分页的SQL应该怎么写
  • 655
分享到

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

2024-04-02 19:04:59 655人浏览 安东尼
摘要

本篇文章为大家展示了一对多分页的sql应该怎么写,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言Mysql一对多的数据分页是非常常见的需求,比如我们要查询商品和商

本篇文章为大家展示了一对多分页的sql应该怎么写,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

前言

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

2. 问题分析

我们先创建一个简单商品表和对应的商品图片关系表,它们之间是一对多的关系:

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

然后我分别写入了一些商品和这些商品对应的图片,通过下面的左连接查询可以看出它们之间具有明显的一对多关系:

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应该怎么写

按照传统的思维我们的分页语句会这么写:

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

当我按照预想传入了(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配置:

<resultMap id="ProductDTO" type="cn.felord.mybatis.entity.ProductDTO">     <id property="productId" column="product_id"/>     <result property="prodName" column="prod_name"/>      <!-- 利用 collection 标签提供的 select 特性 和 column   -->     <collection property="imageUrls" ofType="string" select="selectImagesByProductId" column="product_id"/> </resultMap> <!-- 先查询主表的分页数据    --> <select id="page" resultMap="ProductDTO">     SELECT PRODUCT_ID, PROD_NAME     FROM PRODUCT_INFO     LIMIT #{current},#{size} </select> <!--根据productId 查询对应的图片--> <select id="selectImagesByProductId" resultType="string">     SELECT IMAGE_URL     FROM PRODUCT_IMAGE     WHERE PRODUCT_ID = #{productId} </select>

大部分情况下分页是很容易的,但是一对多还是有一些小小的陷阱的。一旦我们了解了其中的机制,也并不难解决。

上述内容就是一对多分页的SQL应该怎么写,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: 一对多分页的SQL应该怎么写

本文链接: https://lsjlt.com/news/68666.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一对多分页的SQL应该怎么写
    本篇文章为大家展示了一对多分页的SQL应该怎么写,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言MySQL一对多的数据分页是非常常见的需求,比如我们要查询商品和商...
    99+
    2024-04-02
  • sql分页查询语句怎么写
    SQL分页查询语句可以使用LIMIT关键字来实现。具体语法如下:SELECT 列名FROM 表名LIMIT 开始位置, 查询...
    99+
    2023-08-23
    sql
  • 怎么使用PHP编写分页查询的SQL语句
    这篇文章主要讲解了“怎么使用PHP编写分页查询的SQL语句”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用PHP编写分页查询的SQL语句”吧!一、什么是分页查询分页查询是指将一个查询结...
    99+
    2023-07-05
  • Mybatis对sql表的一对多查询问题怎么解决
    这篇“Mybatis对sql表的一对多查询问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Mybatis对sql表...
    99+
    2023-07-02
  • SQL server是怎么分页的
    本篇内容介绍了“SQL server是怎么分页的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、三重循环先取前20页,然后倒序,取倒序后前...
    99+
    2023-06-20
  • 三个以上的表JOIN起来,SQL语句应该怎样写
    要进行三个以上的表JOIN,可以使用多个JOIN语句进行连接。下面是一个示例:```sqlSELECT *FROM tabl...
    99+
    2023-08-08
    SQL
  • 使用oracle怎么实现一对多数据分页查询筛选
    使用oracle怎么实现一对多数据分页查询筛选?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。先来看下第一次sql是如何写的查询之后在外面做...
    99+
    2024-04-02
  • sql怎么将一列数据分成多列
    在 SQL 中,可以通过使用CASE语句和WHEN子句将一列数据分成多列。下面是一个示例: 假设有一个名为orders的表,其中包含...
    99+
    2024-04-09
    sql
  • c#多线程访问同一变量应该怎么解决
    解决 c# 多线程访问同一变量的问题的方法如下:使用锁(lock)使用互斥体(mutex)使用自旋锁(spinlock)使用原子操作 处理 C# 多线程访问同一变量问题 多线程编程中,...
    99+
    2024-05-14
    c# 同步机制
  • sql怎么对多个条件进行分组求和
    在SQL中,可以使用GROUP BY子句来对多个条件进行分组,然后使用SUM函数对每个分组中的值进行求和。例如,假设有一个表格名为o...
    99+
    2023-08-08
    sql
  • Redis的分布式锁应该怎么打开
    这篇文章主要讲解了“Redis的分布式锁应该怎么打开”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis的分布式锁应该怎么打开”吧!要求基于Redis实...
    99+
    2024-04-02
  • mysql的分页查询语句怎么写
    本篇文章给大家分享的是有关mysql的分页查询语句怎么写,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。mysql的分页查询语句怎么写1.查询m...
    99+
    2024-04-02
  • 怎么对java多线程数据进行分页处理
    怎么对java多线程数据进行分页处理?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。常用的java框架有哪些1.SpringMVC,Spring Web MVC是...
    99+
    2023-06-14
  • mysql一对多关联查询分页错误问题的解决方法
    xml问价中查询数据中包含list,需要使用collection <resultMap id="XX" type="com.XXX.XXXX"> <id column="o_i...
    99+
    2024-04-02
  • 怎么用HTML写一个最简单的页面
    今天小编给大家分享一下怎么用HTML写一个最简单的页面的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了...
    99+
    2024-04-02
  • php实现分页功能的代码怎么写
    以下是一个简单的PHP实现分页功能的示例代码:```php```以上代码实现了一个简单的分页功能,假设数据总数为100,每页显示10...
    99+
    2023-09-27
    php
  • 怎么优化mysql分页时offset过大的Sql
    这篇文章将为大家详细讲解有关怎么优化mysql分页时offset过大的Sql,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。通常分页查询的时候会使用这样的语句:SELEC&...
    99+
    2024-04-02
  • vue-cli中怎么利用webpack 构建一个多页面应用
    vue-cli中怎么利用webpack 构建一个多页面应用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。关于vue.jsvue.js是一套...
    99+
    2024-04-02
  • mybatis一对一查询一对多查询遇到的问题怎么解决
    这篇文章主要介绍“mybatis一对一查询一对多查询遇到的问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mybatis一对一查询一对多查询遇到的问题怎么解决”文章能帮助大家解决问题。实体...
    99+
    2023-06-30
  • 支持数据多样性的多模型数据库该怎么分析
    支持数据多样性的多模型数据库该怎么分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在管理数据多样性方面,数据库世界变得有些混...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作