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

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

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个,并且在数据库中直接将我们想要的数据进行了整合。

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pagehelper是一个开源的Java分页插件,可以方便地实现多表查询的分页功能。使用pagehelper进行多表查询分页,需要进行以下几个步骤: 1. 首先,在你的项目中引入pagehelper的依赖。可以在pom.xml文件中添加以下代码: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>最新版本号</version> </dependency> ``` 2. 在需要进行多表查询分页的Mapper接口的方法上,使用@Select注解定义查询语句。查询语句可以包含多个表的关联查询,并通过使用PageHelper.startPage方法设置分页参数。例如: ```java @Select("SELECT a.id, a.name, b.age FROM table_a a LEFT JOIN table_b b ON a.id = b.a_id") List<YourResultType> selectMultiTableData(); ``` 3. 在Service层或者Controller层调用Mapper接口的相应方法,获取查询结果。例如: ```java PageHelper.startPage(pageNum, pageSize); // 设置分页参数 List<YourResultType> resultList = yourMapper.selectMultiTableData(); ``` 4. 处理分页结果。可以通过将查询结果封装到PageInfo对象中,获取分页相关信息。例如: ```java PageInfo<YourResultType> pageInfo = new PageInfo<>(resultList); long total = pageInfo.getTotal(); // 获取总记录数 List<YourResultType> data = pageInfo.getList(); // 获取当前页数据列表 ``` 这样就实现了多表查询分页的功能。可以根据具体的业务需求,调整查询语句和分页参数的设置。注意,PageHelper.startPage方法需要在实际查询之前调用,以便正确地进行分页。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值