标题

  • 前言
  • 方法一: List 不建议使用
  • 方法二: Map 不建议使用
  • 方法三: sql实现 ==最简单 不用动脑、推荐使用==
  • 方法四,推荐使用
  • 一条数据拆分多条数据

前言

首先说明一下场景啊,今天遇到个业务问题,就是通过一个主表,关联另一个表,主表中一条数据,关联出另外一张表多条数据,导致主表也生成了多条重复数据。但我页面展示的时候不希望展示出重复数据。这是我们的业务需求,现在我们来看看有多少方法来解决这个问题。
注:这块可不是数组去重,关于集合数组去重的方法参考。

为了便于理解,我先把模拟一下数据。

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (`id` int(0) NOT NULL,`equalDate1` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`equalDate2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`equalDate3` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`age` int(0) NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '相同数据1', '相同数据2', '相同数据3', '张三', 10);
INSERT INTO `student` VALUES (2, '相同数据1', '相同数据2', '相同数据3', '李四', 12);
INSERT INTO `student` VALUES (3, '相同数据1', '相同数据2', '相同数据3', '王五', 10);
INSERT INTO `student` VALUES (4, '相同数据1', '相同数据2', '相同数据3', '王麻子', 10);
INSERT INTO `student` VALUES (5, '相同数据11', '相同数据21', '相同数据31', '张三1', 10);
INSERT INTO `student` VALUES (6, '相同数据11', '相同数据21', '相同数据31', '张三2', 10);SET FOREIGN_KEY_CHECKS = 1;CREATE TABLE `student` (`id` int NOT NULL,`equalDate1` varchar(20) DEFAULT NULL,`equalDate2` varchar(255) DEFAULT NULL,`equalDate3` varchar(20) DEFAULT NULL,`name` varchar(20) DEFAULT NULL,`age` int(4) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;select * from student;
INSERT INTO student (id,equalDate1,equalDate2,equalDate3,`name`,age)
VALUES(1,"相同数据1", "相同数据2", "相同数据3","张三",10),
(2,"相同数据1", "相同数据2", "相同数据3","李四",12),
(3,"相同数据1", "相同数据2", "相同数据3","王五",10),
(4,"相同数据1", "相同数据2", "相同数据3","王麻子",10),
(5,"相同数据11", "相同数据21", "相同数据31","张三1",10),
(6,"相同数据11", "相同数据21", "相同数据31","张三2",10)select equalDate1,equalDate2,equalDate3
,GROUP_CONCAT(`name`)as nameList,GROUP_CONCAT(`age`)as ageListfrom student GROUP BY equalDate1,equalDate2,equalDate3CREATE TABLE `studentleft` (`id` int NOT NULL,`tableid` int NOT NULL,`name` varchar(20) DEFAULT NULL,`age` int(4) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;select * from studentleft;
INSERT INTO studentleft (id,tableid,`name`,age)
VALUES(1,1, "张三",10),
(2,1,"李四",12),
(3,1,"王五",10),
(4,1,"王麻子",10),
(5,2,"张三1",10),
(6,2,"张三2",10)select s.equalDate1,s.equalDate2,s.equalDate3  from student s  where s.tableid = 1;
select l.`name`,l.age from  studentleft l where l.tableid = 1;
select s.equalDate1,s.equalDate2,s.equalDate3,l.`name`,l.agefrom student s ,studentleft l where s.tableid = l.tableid and s.tableid = 1

实现功能 主表一条数据关联后产生多条数据,现在就想要展示一条数据。



我们先说笨办法 list、map 方法。现实实现不建议这么玩,这里只是学习一下思维,这块还折腾了我前后4个来小时,还是记录一下编码过程
这块我没有连接数据库查,我就模仿了一下查到的集合数

package test;import java.util.List;/*** @version: V1.0* @author: p* @description:* @date:2022/4/1*/
public class Student {//这样相同数据 就展示一条 (把多条年龄、姓名用List接收)public String equalDate1;//相同数据public String equalDate2;//相同数据public String equalDate3;//相同数据public String name;public int age;public String stringAge;public List ageList; //存放年龄集合public List nameList; //拿到姓名集合public Student() {}public Student(String equalDate1, String equalDate2, String equalDate3, String name, int age) {this.equalDate1 = equalDate1;this.equalDate2 = equalDate2;this.equalDate3 = equalDate3;this.name = name;this.age = age;}public Student(String equalDate1, String equalDate2, String equalDate3, String name,String stringAge) {this.equalDate1 = equalDate1;this.equalDate2 = equalDate2;this.equalDate3 = equalDate3;this.name = name;this.stringAge = stringAge;}public String getStringAge() {return stringAge;}public void setStringAge(String stringAge) {this.stringAge = stringAge;}public String getEqualDate1() {return equalDate1;}public void setEqualDate1(String equalDate1) {this.equalDate1 = equalDate1;}public String getEqualDate2() {return equalDate2;}public void setEqualDate2(String equalDate2) {this.equalDate2 = equalDate2;}public String getEqualDate3() {return equalDate3;}public void setEqualDate3(String equalDate3) {this.equalDate3 = equalDate3;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public List getAgeList() {return ageList;}public void setAgeList(List ageList) {this.ageList = ageList;}public List getNameList() {return nameList;}public void setNameList(List nameList) {this.nameList = nameList;}
}

方法一: List 不建议使用

package test;import java.util.ArrayList;
import java.util.List;/*** @version: V1.0* @author: p* @description:* @date:2022/4/1*/
public class TestCollByList {public static void main(String[] args) {//合并相同数据之 使用  list实现//下面是模拟合并 代码调试了3个来小时,注意旗帜判断 跟 i-- 以及最后在保存一次 不容有失Student student1 = new Student("相同数据1", "相同数据2", "相同数据3", "张三", 10);Student student2 = new Student("相同数据1", "相同数据2", "相同数据3", "李四", 12);Student student3 = new Student("相同数据1", "相同数据2", "相同数据3", "王五", 10);Student student4 = new Student("相同数据1", "相同数据2", "相同数据3", "王麻子", 10);Student student5 = new Student("相同数据11", "相同数据21", "相同数据31", "张三1", 10);Student student6 = new Student("相同数据11", "相同数据21", "相同数据31", "张三2", 10);//首先说明一下  前三个数据是一致的 不一致的只是后面2个 像上面6条数据 按照我们需求其实就两条数据 ,// 也就是我们要合并前3项的结果为一条,后面两条变成一个两个List返回  也是我们的需求List<Student> studentList = new ArrayList<>();List<Student> studentListNew = new ArrayList<>();studentList.add(student1);studentList.add(student2);studentList.add(student3);studentList.add(student4);studentList.add(student5);studentList.add(student6);String flag = "";List listName = new ArrayList();List listAge = new ArrayList();int size = studentList.size();for (int i = 0; i < size; i++) {if (i == 0) {flag = studentList.get(0).getEqualDate1();}//String falgType = studentList.get(i).getEqualDate1();if (flag.equals(studentList.get(i).getEqualDate1())) {listAge.add(studentList.get(i).getAge());listName.add(studentList.get(i).getName());//这里也必须放个旗帜判断flag = studentList.get(i).getEqualDate1();} else {Student student = new Student();student.setEqualDate1(studentList.get(i - 1).getEqualDate1());student.setEqualDate2(studentList.get(i - 1).getEqualDate2());student.setEqualDate3(studentList.get(i - 1).getEqualDate3());student.setAgeList(listAge);student.setNameList(listName);studentListNew.add(student);//下面必须清空上次保留的历史信息listName = new ArrayList();listAge = new ArrayList();//这个旗帜判断必须放这里不被下面 i--影响flag = studentList.get(i).getEqualDate1();i--;//这步很关键,因为走else 就走不了if i又在自增,你满足if时就少一条}//这个是最后一步保存下来,if (i == size-1) {Student student = new Student();student.setEqualDate1(studentList.get(i - 1).getEqualDate1());student.setEqualDate2(studentList.get(i - 1).getEqualDate2());student.setEqualDate3(studentList.get(i - 1).getEqualDate3());student.setAgeList(listAge);student.setNameList(listName);studentListNew.add(student);}}}
}

方法二: Map 不建议使用

package test;import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;/*** @version: V1.0* @author: p* @description:* @date:2022/4/1*/
public class TestCollByMap {public static void main(String[] args) {//合并相同数据之 使用  Map实现   map特点 同key覆盖  跟list逻辑一样Student student1 = new Student("相同数据1", "相同数据2", "相同数据3", "张三", 10);Student student2 = new Student("相同数据1", "相同数据2", "相同数据3", "李四", 12);Student student3 = new Student("相同数据1", "相同数据2", "相同数据3", "王五", 10);Student student4 = new Student("相同数据1", "相同数据2", "相同数据3", "王麻子", 10);Student student5 = new Student("相同数据11", "相同数据21", "相同数据31", "张三1", 10);Student student6 = new Student("相同数据11", "相同数据21", "相同数据31", "张三2", 10);//首先说明一下  前三个数据是一致的 不一致的只是后面2个 像上面6条数据 按照我们需求其实就两条数据 ,// 也就是我们要合并前3项的结果为一条,后面两条变成一个两个List返回  也是我们的需求List<Student> studentList = new ArrayList<>();Map map = new LinkedHashMap();//有序,保留原有顺序List<Map> all = new ArrayList<>();studentList.add(student1);studentList.add(student2);studentList.add(student3);studentList.add(student4);studentList.add(student5);studentList.add(student6);String flag = "";List listName = new ArrayList();List listAge = new ArrayList();int size = studentList.size();for (int i = 0; i < size; i++) {if (i == 0) {flag = studentList.get(0).getEqualDate1();}if (flag.equals(studentList.get(i).getEqualDate1())) {listAge.add(studentList.get(i).getAge());listName.add(studentList.get(i).getName());//这里也必须放个旗帜判断flag = studentList.get(i).getEqualDate1();map.put("equalDate1",studentList.get(i).getEqualDate1());map.put("equalDate2",studentList.get(i).getEqualDate2());map.put("equalDate3",studentList.get(i).getEqualDate3());map.put("ageList",listAge);map.put("nameList",listName);} else {//下面必须清空上次保留的历史信息listName = new ArrayList();listAge = new ArrayList();all.add(map);map = new LinkedHashMap();//todo 防止同名覆盖问题  很关键//这个旗帜判断必须放这里不被下面 i--影响flag = studentList.get(i).getEqualDate1();i--;//这步很关键,因为走else 就走不了if i又在自增,你满足if时就少一条}//这个是最后一步保存下来,if (i == size-1) {all.add(map);}}}
}

方法三: sql实现 最简单 不用动脑、推荐使用

package test;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** @version: V1.0* @author: p* @description:* @date:2022/4/1*/
public class TestCollBySql {public static void main(String[] args) {//合并相同数据之 使用  sql实现   最简单 不用动脑//我们通过sql中的 group_concat()函数,把数据直接干到一条, 把姓名,年龄 用,分割//现在如果说前端来处理的话后端已经完事了,如果前端不想处理,让我们反对应的listStudent student1 = new Student("相同数据1", "相同数据2", "相同数据3", "张三,李四,王五,王麻子", "10,12,10,10");Student student5 = new Student("相同数据11", "相同数据21", "相同数据31", "张三1,张三2", "10,10");//首先说明一下  前三个数据是一致的 不一致的只是后面2个 像上面6条数据 按照我们需求其实就两条数据 ,// 也就是我们要合并前3项的结果为一条,后面两条变成一个两个List返回  也是我们的需求List<Student> studentList = new ArrayList<>();studentList.add(student1);studentList.add(student5);for (Student student : studentList) {String[] splitAge = student.getStringAge().split(",");String[] splitName = student.getName().split(",");student.setNameList(Arrays.asList(splitName));student.setAgeList(Arrays.asList(splitAge));}System.out.println(studentList);}}

方法四,推荐使用

这块我不在再写具体操作,因为我就是用这个解决问题的,现在时间也很晚了就不再写了。

思想:我们两张表分开查,我们查出主表所有数据,我们前面说过,主表数据是不重复的,通过主表关联id去查另外一张表,查出它的集合,然后在 主表定义对应的list字段 来接受查出来的list。可能光这么描述看不太懂,我随后赋个截图吧。

select s.equalDate1,s.equalDate2,s.equalDate3
from student s  where s.tableid = 1;select l.`name`,l.age from  studentleft l where l.tableid = 1;

一条数据拆分多条数据

(正常来说我们查出来的数据就是多条的,不需要做处理就是一对多)
既然有多对一,就有一对多,比如导出数据的时候,我就需要把你合并为1条的数据拆分好几条,然后再利用表格合并相同数据。

这块方法也很多,我就不 一 一 列举了,


上面这么写返回的参数形式有些恶心,进行如下优化
其实也不是多么恶心,只不过是都放在一个类中的对应list里,无伤大雅

同样是返回两条数据,这么看起来层次感就很好

Java实现多条相同数据合并为一条数据相关推荐

  1. mysql 合并两个update_如何将多条update语句合并为一条

    需求: 如何将多条update语句合并为一条update语句: 如,update table1 set col='2012' where id='2014001' update table1 set  ...

  2. Mysql---将多条查询记录合并为一条,用逗号连接展示

    1. 背景:想要将多条查询结果合并一条展示.如下图: 小赵和小李放在一行. 2. 使用方法:这里使用到GROUP_CONCAT函数 eg: before select name from studen ...

  3. sql server 多条记录数据合并为一条_面试必备sql知识点——MySQL基础

    在刷了上百道sql题后,发现所有的题目都是基于某一个或几个知识点来做考察的,所以理清基础的知识细节,才能在题目考察到任意知识点时,找到解决线索. 温故而知新,学习在于总结,于是我再次对已经学习过的my ...

  4. sql server 多条记录数据合并为一条_如何利用Python实现SQL自动化?

    全文共5520字,预计学习时长16分钟 来源:Pexels 笔者在工作中经常要使用SQL,其不乏存在恼人的细微差异和种种限制,但说到底,它是数据行业的基石.因此,对于每一位数据领域的工作者,SQL都是 ...

  5. react + ant design 实现动态合并Table表格(相同数据合并为一条)

    一.首先来看看需求,主要就是一个表格的合并 这里是官方文档给出的关于合并的方法 表头只支持列合并,使用 column 里的 colSpan 进行设置. 表格支持行/列合并,使用 render 里的单元 ...

  6. server多笔记录拼接字符串 sql_sqlserver 将多行数据查询合并为一条数据

    有这样一个需求:表T_FUN_TASK为任务表,有字段(TASKID,TASKNAME),表T_FUN_LOGBOOK为日志表,有字段(LOGID,TASKID,LOGDATE),一个任务可持续多天, ...

  7. sql语句实现多条数据合为一条数据

    今天遇到个函数感觉很有用,给你们举个例子吧: 当我们给用户多个角色的时候,我们的用户角色表的展示方式有两种, 一种是把所有角色何在一起变成一个字符串,然后在该表查看用户就能看到一条关于用户角色的数据 ...

  8. ECharts 多条坐标轴轴线,合并为一条线

    一.问题 2条y轴,y轴的坐标轴轴线axisLine太多,扰人视线,如图 二.经过 刚开始用分割线(yAxis.splitLine)做出来的这个效果. 后期,改为两条线合并为一条. 网上找一个没有关于 ...

  9. java 合并到一行_mysql中将多行数据合并成一行数据

    一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据 例如:一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句: 1 SELECT am.acti ...

最新文章

  1. 分布式内存数据库 Geode
  2. 开发日记-20190617 关键词 bash命令尝试模拟点击事件
  3. 【Linux网络编程】因特网的IP协议是不可靠无连接的,那为什么当初不直接把它设计为可靠的?
  4. oracle误删数据的解决方法
  5. 输出最大值MXNet实现
  6. 牛客练习赛60 ~ 斩杀线计算大师
  7. 吓人!深夜悄悄上街扫地!
  8. linux系统中scp命令的用法
  9. keil4怎么移植其他人的程序_【调试笔记】韦东山:在100ask_imx6ull上移植使用六轴传感器ICM20608...
  10. qt +ChartDirector 绘制图表
  11. 图解算法之排序算法(3)——插入排序
  12. NHL明星与美国冰球协会联手发起NFT拍卖
  13. 合作活动 | 鲸准产业价值峰会AI专场,共探AI商业模式
  14. Updater Application Block for .net 2.0 发布了
  15. redis 公网 安全_redis配置之安全配置
  16. 微服务实战(六):选择微服务部署策略 - DockOne.io
  17. Mysql安装包安装教程(亲测简单高效版)
  18. 四川华为EC6108V9C悦me和CA高安版_卡刷固件包
  19. 坚果云 不在计算机显示图标,在Ubuntu18.04系统顶栏不显示坚果云图标的解决办法...
  20. layui数据表格自定义数据项

热门文章

  1. VC/PE乐见:简化基金注册程序,鼓励险资流向股权投资...
  2. 艺赛旗RPA离线识别普通验证码
  3. 从零开始学matplotlib画图(一): 极速上手
  4. 单字双字三字_单字写法-单字怎么读-双字繁体字怎么写
  5. mac壁纸每天自动更换
  6. 抖音全球购安心购服务规范|四川鹰迪
  7. 关于手机屏幕的一些知识(2)
  8. (ACWing217)绿豆蛙的归宿(数学期望)
  9. python批量读取文件名_Python实现文件名批量处理
  10. 一个印度人写的VC串口类CSerialCom(有串口基础介绍)