请问一下,我这个5表联查的数据问题出现在哪,是要用子查询,先查id,再查整体数据吗,像测试2,测试5这种数据,处罚类型和违规类型为啥会重复一次啊
引用 皆我百晓生 小程序回复内容作答:
从你提供的SQL语句来看,问题出在以下部分:
GROUP_CONCAT(pun.punid ORDER BY cp.punid SEPARATOR) AS punids,
GROUP_CONCAT(pun.punname ORDER BY cp.punid SEPARATOR) AS punnames,
GROUP_CONCAT(vio.vioid ORDER BY cv.vioid SEPARATOR) AS vioids,
GROUP_CONCAT(vio.vioname ORDER BY cv.vioid SEPARATOR) AS vionames
你在这里使用了GROUP_CONCAT函数来将punid、punname、vioid、vioname连接为一个字符串,但是你没有指定每个表之间的关联条件。所以可能会导致重复显示。
解决办法是,在每个GROUP_CONCAT函数中使用DISTINCT关键字来去除重复值。修改后的代码如下:
GROUP_CONCAT(DISTINCT pun.punid ORDER BY cp.punid SEPARATOR) AS punids,
GROUP_CONCAT(DISTINCT pun.punname ORDER BY cp.punid SEPARATOR) AS punnames,
GROUP_CONCAT(DISTINCT vio.vioid ORDER BY cv.vioid SEPARATOR) AS vioids,
GROUP_CONCAT(DISTINCT vio.vioname ORDER BY cv.vioid SEPARATOR) AS vionames
这样就可以确保每个联表查询结果中的重复值被去除了。
【相关推荐】
现存在两表(students学生表、honor荣誉表),表结构和相关数据如下:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for honors
-- ----------------------------
DROP TABLE IF EXISTS `honors`;
CREATE TABLE `honors` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`honor_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '荣誉名称',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of honors
-- ----------------------------
INSERT INTO `honors` VALUES (1, '最强干饭王');
INSERT INTO `honors` VALUES (2, '最美班长');
INSERT INTO `honors` VALUES (3, '学生奖学金一等奖');
INSERT INTO `honors` VALUES (4, '国家奖学金');
INSERT INTO `honors` VALUES (5, '省年度大学生');
INSERT INTO `honors` VALUES (6, '篮球小王子');
SET FOREIGN_KEY_CHECKS = 1;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for students
-- ----------------------------
DROP TABLE IF EXISTS `students`;
CREATE TABLE `students` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`student_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '学生姓名',
`honor_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '荣誉id',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of students
-- ----------------------------
INSERT INTO `students` VALUES (1, '张大卫', '1,2,3,4');
INSERT INTO `students` VALUES (2, '陈小楠', '3,4,5,6');
SET FOREIGN_KEY_CHECKS = 1;
学生表
荣誉表