mysql联查数据重复显示怎么办

请问一下,我这个5表联查的数据问题出现在哪,是要用子查询,先查id,再查整体数据吗,像测试2,测试5这种数据,处罚类型和违规类型为啥会重复一次啊

img

引用 皆我百晓生 小程序回复内容作答:
从你提供的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

这样就可以确保每个联表查询结果中的重复值被去除了。

【相关推荐】



  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7515888
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:MySQL建立一个数据库中有多张表,每个表中都有id作为主键,为什么第一张表会报错?
  • 你还可以看下mysql参考手册中的 MySQL 字符集、对齐方式、统一编码 复杂字符集的字符串拼写支持
  • 您还可以看一下 吴京忠老师的MySQL 备份与恢复详解(高低版本 迁移;不同字符集 相互转换;表课程中的 04. 备份 多个数据库 -3小节, 巩固相关知识点
  • 除此之外, 这篇博客: MySQL一个表存储另外一个表的多个id集合,如何关联查询中的 一、两张表 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

            现存在两表(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;

    学生表

    荣誉表


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^