PageHelper多表关联查询数量问题

news2024/12/23 16:16:09

PageHelper多表关联查询数量问题

通常我们会使用PageHelper进行分页查询,但是当分页查询被用到多个表的关联查询中时,就有可能导致查询出来的数据总数比我们想要的多得多。

首先在数据库中创建三个demo表:role、path、role_path

role角色表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for role
-- ----------------------------
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role`  (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of role
-- ----------------------------
INSERT INTO `role` VALUES (1, '管理员');
INSERT INTO `role` VALUES (2, '竞赛负责人');
INSERT INTO `role` VALUES (3, '教师');
INSERT INTO `role` VALUES (4, '学生');

SET FOREIGN_KEY_CHECKS = 1;

path路径表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for path
-- ----------------------------
DROP TABLE IF EXISTS `path`;
CREATE TABLE `path`  (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of path
-- ----------------------------
INSERT INTO `path` VALUES (1, '学生管理', '/stuMa');
INSERT INTO `path` VALUES (2, '教师管理', '/teaMa');
INSERT INTO `path` VALUES (3, '队伍管理', '/teamMa');
INSERT INTO `path` VALUES (4, '项目管理', '/proMa');

SET FOREIGN_KEY_CHECKS = 1;

role_path角色路径关系表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for role_path
-- ----------------------------
DROP TABLE IF EXISTS `role_path`;
CREATE TABLE `role_path`  (
  `role_id` int(20) NULL DEFAULT NULL,
  `path_id` int(20) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of role_path
-- ----------------------------
INSERT INTO `role_path` VALUES (1, 1);
INSERT INTO `role_path` VALUES (1, 2);
INSERT INTO `role_path` VALUES (1, 3);
INSERT INTO `role_path` VALUES (1, 4);
INSERT INTO `role_path` VALUES (2, 4);
INSERT INTO `role_path` VALUES (3, 3);
INSERT INTO `role_path` VALUES (3, 4);
INSERT INTO `role_path` VALUES (4, 3);

SET FOREIGN_KEY_CHECKS = 1;
在多表关联查询中使用PageHelper的原因
想获取多个表中的数据

假设我们想要查询角色所对应的路径的名称有哪些,此时就会进行多表关联查询

SELECT
	role.NAME,
	res.NAME pathName 
FROM
	role
	INNER JOIN ( SELECT role_path.role_id, path.NAME FROM role_path INNER JOIN path ON role_path.path_id = path.id ) res ON res.role_id = role.id

查询结果

在这里插入图片描述

正常情况下我们通过mybatis的封装,就可以将查询到的数据封装在4个角色对象当中,但是如果我们还想使用PageHelper进行分页查询,那么PageHelper给我们返回的数据总数total就会是8条,这样很显然不是我们想要的数据。

解决方法

我们可以在数据库中将角色名称相同的数据进行合并,并使用GROUP_CONCAT(属性名),将指定的属性进行拼接(如果分组后的属性存在多个)

SELECT
	role.NAME,
	GROUP_CONCAT( res.NAME ) pathName 
FROM
	role
	INNER JOIN ( SELECT role_path.role_id, path.NAME FROM role_path INNER JOIN path ON role_path.path_id = path.id ) res ON res.role_id = role.id 
GROUP BY
	role.NAME

查询结果

在这里插入图片描述

这样再使用PageHelper时返回的total仍然是4个,并且在数据库中直接将我们想要的数据进行了整合。

想在多个表中进行条件查询

如果我们想要获取有队伍管理权限的角色拥有的权限信息,此时也是需要进行多表查询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1186002.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一练 | 华为认证真题练习Day127

1、如图所示,关于OSPF的拓扑和配置,下列说法中正确的是()。 A. R1与R2相比,R2更有机会成为DR,因为它的接口DR优先级值较小 B. 只要把R1的接口网络类型恢复为默认的广播类型,R1和R2即可建立稳定…

【可视化Java GUI程序设计教程】第5章 Swing容器的使用

Swing采用自顶向下的方式构建GUI,即先创建容器,再向容器中添加组件。 “组件”面板中的Swing容器 5.1 面板容器(JPanel) 5.5.1 使用方法 创建面板有以下两种方法 (1)创建一个窗体(JFrame&…

kaggle中报错NameError: name ‘q_1‘ is not defined

在开始练习之前,先点击“全部运行”按钮。

联合阿里p8测试开发耗时一个月整理的全套从0开始到功能测试再到自动化测试再进阶测试开发学习路线图

前言: 从事测试工作已10有余了,今天想聊一下自己刚入门时和现在的今昔对比,虽然现在也没什么成就,只能说笑谈一下自己的测试生涯。 技术栈的变化: 刚开始是做的开发,也是做了三年的开发,刚开始…

工业CT 三维重建 及分割

目录 工业CT介绍 工业CT主要应用于以下领域: CT三维重建软件: 效果: 工业CT介绍 工业CT设备是基于线阵探测器的断层扫描技术,是一种常用的无损检测技术,用于获取物体内部的准确三维结构信息。它通过X射线的投射和接…

Linux - 实现一个简单的 shell

前言 之前我们对进程的替换,进程地址空间等等的概念进行了说明,本篇博客会基于这些知识点来 实现一个简单的 shell ,如有疑问,可以参考下述博客:Linux - 进程程序替换 - C/C 如何实现与各个语言之间的相互调用 - 替换…

Spring Gateway基础知识总结

本文主要总结Spring Gateway的基础用法,内容包括网关、Spring Gateway工作流程、Spring Cloud Gateway搭建、路由配置方式、负载均衡实现、断言工厂这几个部分 目录 1. 网关 1.1 网关介绍 1.2 网关对比 1.3 Spring Gateway 1.4 核心概念 1.6 总结 2. Spring …

编程知识\_C与汇编深入分析

1. 汇编怎么调用C函数 1.1 直接调用 bl main 1.2 想传参数怎么办? 在arm中有个ATPCS规则(ARM-THUMB procedure call standard(ARM-Thumb过程调用标准)。 约定r0-r15寄存器的用途: r0-r3 调用者和被调用者之间传参数 r4-r11 函…

ARM寄存器及功能介绍/R0-R15寄存器

1、ARM 寄存器组介绍 ARM 处理器一般共有 37 个寄存器,其中包括: (1) 31 个通用寄存器,包括 PC(程序计数器)在内,都是 32 位的寄存器。 (2) 6 个状态寄存器…

Linux学习笔记--高级

Shell概述 1,shell概述 是一个c语言编写的脚本语言,是linux和用户的桥梁,用户输入命令交给shell处理。shell,将相应的操作传递给内核(kernel),内核把处理的结果输出给用户 1.1Shell解释器有哪…

oled显示器程序(IIC)从stm32f103移植到stm32f429出现bug不显示-解决移植失败问题

出现问题处: 刚开始更换了这两行代码,然后更换位置后,oled正常显示,如下为正确顺序 I2C_Configuration();//配置CPU的硬件I2COLED_Init();//OLED初始化 在这段代码中,I2C_Configuration() 函数用于配置CPU的硬件 I2C…

阶段七-Day02-Spring02

一、Spring的注解支持 1. 为什么使用Spring注解 在昨天的练习中有这样的一段代码,为了给UserServiceImpl注入UserMapper对象。 2. Spring支持的注解(IoC/DI相关) 下面Repository、Service、Controller、Configuration都是Component注解的…

阴虱是怎么长出来的?皮肤性病科主任谭巍讲述五大因素

阴虱,是一种皮肤接触性传染性寄生虫病,在卫生情况不好的前提下有感染阴虱的可能性。人在感染阴虱后会对身心健康带来负面影响,所产生的临床症状会直接影响感染者的工作生活,所以日常应注意预防阴虱病。 然而,到现在还…

JS逆向爬虫---响应结果加密⑤【token参数加密与DES解密】

https://spa7.scrape.center/ 文本数据 数据内嵌在js内,普通合理请求即可获取 图片 位于固定接口 类似https://spa7.scrape.center/img/durant.png 固定url名称 Token 参数确定 base64Name > base64编码后的中文名称 nodejs 代码 //导入crypto-js模块 var CryptoJS…

Spring笔记(四)(黑马)(web层解决方案-SpringMVC)

01、Spring MVC 简介 1.1 SpringMVC概述 SpringMVC是一个基于Spring开发的MVC轻量级框架,Spring3.0后发布的组件,SpringMVC和Spring可以无 缝整合,使用DispatcherServlet作为前端控制器,且内部提供了处理器映射器、处理器适配器…

ONP: Error #15: Initializing libiomp5md.dll【报错系列】

问题如下: 解决方案: 譬如我的就是这个: 删掉,再回去运行即可。

web应用程序、Django框架的学习

web应用程序 什么是web? Web应用程序是一种可以通过Web访问的应用程序,用户只需要有浏览器即可,不需要再安装其他软件 案例: 淘宝网、京东网、博客园、等都是基于web应用的程序 应用程序有两种模式C/S、B/S。C/S是客户端/服务器端程序&#xff0c…

Oracle Primavera Unifier 23.10 新特征

根据官方的说法,Unifier 23.7 ~ 23.9 更多为对功能bug的修复,以下将对23.10进行重点介绍 Cost Sheets Cost Sheets Support Conditional Formatting Conditional formatting of table data is now supported in cost sheets with features such as ce…

微信公众号全流程

申请公众号(服务号已认证)web开发者工具中绑定开发人员(该开发人员需要关注1中申请的公众号)基本配置 3.1 服务器配置 URL:验证服务器(后端写的验证服务器的接口) 后端代码:egg.js …

杂货铺 | citespace的使用

安装教程 【CiteSpace保姆级教程1】文献综述怎么写? 📚数据下载 1. 新建文件夹 2. 数据下载 知网高级检索 数据选中导出 :一次500 导出后重命名为download_xxx.txt,放到input文件里 3. 数据转换 把output里的数据复制到data里…