PageHelper多表关联查询数量问题

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的原因
想获取多个表中的数据

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

SELECTrole.NAME,res.NAME pathName 
FROMroleINNER 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(属性名),将指定的属性进行拼接(如果分组后的属性存在多个)

SELECTrole.NAME,GROUP_CONCAT( res.NAME ) pathName 
FROMroleINNER 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 BYrole.NAME

查询结果

在这里插入图片描述

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

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

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

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

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

相关文章

使用Selenium发邮件附件

发邮件可以使用SMTP协议实现程序去发送,但附件的不能太大,一般不超过20M。 以下使用Selenium模拟发送邮件,跳过这个限制,网上找了很多资料,都没有完整实现的,那么自己实现一个,以下代码用Python…

WM 报错不含领货点存储类型的存储类型需要部分搁板管理

试图为SAP新建堆放策略维B标准存储类型系统报错如下: 不含领货点存储类型的存储类型需要部分搁板管理 加个P类型的,先保存,然后再改 解决方案: 进入如下配置路径, 新增一个配置条目,如上图示,…

ci-cd的流程

1、项目在gitlab上,从gitlab上使用git插件获取源码,构建成war包,所以使用tomcat作为运行环境 发布 :使用maven插件发布,使用ssh连接。

小米6安装Ubuntu Touch系统也不是很难嘛

序言 这个文章是用来解说,小米6如何安装Ubuntu Touch系统 正文 安装这个系统需要注意的几点 1.手机必须已经解BL锁 2.没了 安装步骤 先双击打开压缩包查看,按照第一步第二步来进行执行,下面是解压图片 第一步 1.打开第一个文件夹 复制刷入rec的命令.txt里面的内容,然后打开红…

HTTP-HTTPS区别详解

一、HTTP协议 1. GET和POST的请求的区别 Post 和 Get 是 HTTP 请求的两种方法,其区别如下: 应用场景: GET 请求是一个幂等的请求,一般 Get 请求用于对服务器资源不会产生影响的场景,比如说请求一个网页的资源。而 Po…

Mac 禁用一些高占用cup的进程

什么是CrashReporter? CrashReporter在应用程序崩溃的任何时候都会运行,它旨在保存应用程序状态,以帮助开发人员找出应用程序崩溃原因。基本上,一个进程是启动、崩溃(并调用CrashReporter),然后…

竞赛选题 深度学习火车票识别系统

文章目录 0 前言1 课题意义课题难点: 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 图像识别 火车票识别系统 该项目较为新颖,适…

百度上线“文心一言”付费版本,AI聊天机器人市场竞争加剧

原创 | 文 BFT机器人 百度不愧是我国AI技术领域的先行者,每年致力于人工智能领域取得技术产品的突破和创新。据爆料称,百度的文心一言有突破了新境界,开创了文心大模型4.0会员版本。从线上的to C产品到试水商业化,百度都是争先走…

kubernetes集群编排——k8s认证授权

pod绑定sa [rootk8s2 ~]# kubectl create sa admin [rootk8s2 secret]# vim pod5.yaml apiVersion: v1 kind: Pod metadata:name: mypod spec:serviceAccountName: admincontainers:- name: nginximage: nginxkubectl apply -f pod5.yamlkubectl get pod -o yaml 认证 [rootk8s…

iOS 让界面元素的文字随着语言的更改而变化——本地化文字跟随

在我的 App 内置的设置中,修改了语言,这时需要让当前界面的文本跟着改变语言。 解决方法是:添加一个观察者,观察 localize 本地语言的通知,然后一有变化就调用自定义的方法执行操作。(而设置中其实是改变了…

华为交换机忘记console密码怎么办?

console线RJ45头 连接交换机console口,usb接口连接电脑电脑桌面计算机右键-》管理,端口查看端口是com几 3打开secureCRT 点击第二个图标,快速连接,然后设置下参数,如下图 4、重启交换机 5、看到如下图提示信息&#x…

C语言 指针进阶

目录 数组指针 指针数组访问数组元素 再次讨论数组名 数组指针访问一维数组(但是这样会很别扭) 访问二维数组元素 非数组指针访问 数组指针访问 数组传参Demo 一维数组传参 二维数组传参 指针数组指针 字符指针 函数指针 函数指针调用时可以…

校园安防监控系统升级改造方案:如何实现设备利旧上云与AI视频识别感知?

一、背景与需求分析 随着现代安防监控科技的兴起和在各行各业的广泛应用,监控摄像头成为众所周知的产品,也为人类的工作生活提供了很大的便利。由于科技的发达,监控摄像头的升级换代也日益频繁。每年都有不计其数的摄像头被拆掉闲置&#xf…

Apache Maven;会话技术

Apache Maven是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档。 Maven模型有: 项目对象模型、依赖管理模型、插件 会话技术: 会话&#xff1a…

2023年云计算的发展趋势如何?

混合云的持续发展:混合云指的是将公有云和私有云进行结合,形成一种统一的云计算环境。随着企业对数据隐私和安全性的要求越来越高,以及在数据存储和处理方面的需求不断增长,混合云正在逐渐成为主流。预计未来混合云将会继续保持高…

C++学习笔记---命名空间namespace

文章目录 前言简介定义命名空间using指令不连续&嵌套的命名空间 前言 wu 简介 C中的命名空间(Namespace)是一种用于组织和封装代码的机制,它允许你将一组相关的函数、类、变量和其他标识符放置在一个逻辑分组内,以便在不同的…

【ARM Coresight 系列文章 3.5 - ARM Coresight -- JTAG-DP(JTAG Debug Port) 详细介绍】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 概述1.1 DP elements1.1.1 外部连接到 JTAG-DP上的信号1.1.2 Debug TAP 状态机1.2 指令扫描链和指令1.3 DPv3 JTAG-DP 访问AP示意图概述 本节内容主要介绍 JTAG Debug Port 、Debug Test Access Port (DBGTAP), D…

浅谈Elasticsearch查询和搜索

Elasticsearch查询和搜索 Elasticsearch是一个分布式、实时的搜索和分析引擎,广泛应用于全文搜索、日志分析、实时数据分析等场景。Elasticsearch提供了丰富的查询和搜索功能,如查询DSL、过滤、排序、分页、高亮和聚合等。本文将详细介绍如何在Elastics…

Github 生成SSH秘钥及相关问题

1.生成过程参考:Github 生成SSH秘钥(详细教程)_github生成密钥controller节点生成ssh秘钥-CSDN博客 2.遇到的问题:GitHub Connect: kex_exchange_identification: Connection closed by remote host 参考:解决 GitHu…

搜索引擎Elasticsearch基础与实践

倒排索引 将文档中的内容分词,然后形成词条。记录每条词条与数据的唯一表示如id的对应关系,形成的产物就是倒排索引,如下图: ElasticSearch数据的存储和搜索原理 这里的索引库相当于mysql中的database。一个文档(do…