网站开发网站建设公司,网站如何上传,最便宜的货源网站大全,石河子网站建设公司PageHelper多表关联查询数量问题
通常我们会使用PageHelper进行分页查询#xff0c;但是当分页查询被用到多个表的关联查询中时#xff0c;就有可能导致查询出来的数据总数比我们想要的多得多。
首先在数据库中创建三个demo表#xff1a;role、path、role_path
role角色表…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个并且在数据库中直接将我们想要的数据进行了整合。
想在多个表中进行条件查询
如果我们想要获取有队伍管理权限的角色拥有的权限信息此时也是需要进行多表查询