网站首页 > 技术文章 正文
问题(场景)
今天有个需求,我看是用来关联用户表和订单表。
前端有个页面,要查询订单和客户基本信息。
案件号 | 客户id | 客户姓名 | 客户年龄 |
240121112134 | 100002 | 张三 | 26 |
这个页面字段来自两张表:
* t_cus
* t_case
我的解决方案
我当时跟我同事说了下,直接关联查询解决吧。
直接写sql:
select c.case_no,c,cus_id,u,cus_name,u.cus_age
from t_case c
left join t_cus u on u.cus_id = c.cus_id
同事看了我的方案,不让我这么做
同事解决方案
思路如下:
先从t_case表查出10条数据到内存(t_case作为主表),然后取出10条数据的uid,再调用CusService#listCus(uids),得到对应的cusList。此时内存中有10条Case,也有10条cus,匹配组合即可。
代码如下:
public List<CaseExtendsTO> getList(Integer page, Integer pageSize) {
// 1.查询Case
List<Case> caseList = listCase(page, pageSize);
// 2.取出里面的所有uid
List<Long> uids = caseList.stream()
.map(Case::getUid)
.collect(Collectors.toList());
// 3.查出cusList
List<Cus> cusList = listCus(uids);
// 4.把List转成Map
Map<Long, Cus> cusMap = new HashMap<Long, Cus>();
for(cusList : cus){
cusMap.put(cus.getId(), cus);
}
// 组合并返回数据
List<CaseExtendsTO> result = new ArrayList<>();
CaseList.foreach(Case->{
CaseExtendsTO CaseExtends = new CaseExtendsTO();
BeanUtils.copyProperties(Case, CaseExtends);
// 根据Case的uid从cusMap获取cus(此处省略cus null判断)
Cus cus = cusMap.get(Case.getUid());
CaseExtends.setCusAge(cus.getCusAge());
CaseExtends.setCusName(cus.getCusName());
result.add(CaseExtends);
});
return result;
}
同事后来又优化了一下(主要第4点):
public List<CaseExtendsTO> getList(Integer page, Integer pageSize) {
// 1.查询Case
List<Case> caseList = listCase(page, pageSize);
// 2.取出里面的所有uid
List<Long> uids = caseList.stream()
.map(Case::getUid)
.collect(Collectors.toList());
// 3.查出cusList
List<Cus> cusList = listCus(uids);
// 4.把List转成Map(优化了这里)
Map<Long, Cus> cusMap = cusList.stream()
.collect(Collectors.toMap(Cus::getId(), cus->cus));
// 组合并返回数据
List<CaseExtendsTO> result = new ArrayList<>();
caseList.foreach(case->{
CaseExtendsTO caseExtends = new CaseExtendsTO();
BeanUtils.copyProperties(case, caseExtends);
// 根据case的uid从cusMap获取cus(此处省略cus null判断)
Cus cus = cusMap.get(case.getUid());
caseExtends.setCusAge(cus.getCusAge());
caseExtends.setCusName(cus.getCusName());
result.add(caseExtends);
})
return result;
}
思路扩展
有时遇到复杂的统计报表等数据,很难通过上面“内存关联”的方式完成需求,
此时可能如果有大数据部门,可以利用大数据的技术进行解决。进行不断的优化,性能达到最好。
留个关注
《日常分享系列》,会持续更新,想了解的朋友可以关注 ,文章有帮助的话可以长按点赞有惊喜!!!文章比较长,大家可以先 收藏、转发后再看,有什么补充可以在下面评论,谢谢大家!
猜你喜欢
- 2024-11-16 从阿里手册引出的Join查询思考(阿里技术手册)
- 2024-11-16 Python中join()方法——字符串、路径拼接的常用方法
- 2024-11-16 oracle 多表连接查询 join(一)(oracle多表联查效率优化)
- 2024-11-16 让程序员头疼的微服务下数据聚合join(一)
- 2024-11-16 神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程你是否知道?
- 2024-11-16 MySQL的Join到底能不能用,一文搞懂它
- 2024-11-16 一文看懂Mycat跨分片Join实现--全局表、ER分片、HBT、sharejoin
- 2024-11-16 为什么大厂不建议使用多表join?(为什么要多表查询)
- 2024-11-16 SQL Server 2012 高级用法(三)之Join
- 2024-11-16 什么,LEFT JOIN 会变成 JOIN?(left join作用)
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-