一次SQL查询语句的优化
1.项目中之前的"我关注的拍品列表"需要添加筛选功能,因为目前显示的关注的拍品太多没有进行分类,用户体验差。
2.添加筛选条件之后,可以筛选出“未开始”“进行中”“已结束”三种情况的拍品。
其中
“未开始”--->状态为 1
“进行中”---->状态为 2
“已结束”---->状态为 3 or 4 or 5 or 6 or 7
3.优化之前,每一个条件都书写了一个SQL 语句。 功能能够实现,但是代码比较冗余。
//未开始状态
@Query(value="SELECT a.id,a.auc_id,a.crt_time,a.crt_user_id,a.crt_user_name,a.customer_id,a.upd_time,a.upd_user_id,a.upd_user_name FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id "
+ "AND a.customer_id = ?1 AND ( b.STATUS = 1) order by a.crt_time desc limit ?2,?3",nativeQuery=true)
List<AucAttention> findAllByCustomerIdAndAucLotStatus1(Long customerId,
int i, int rows); @Query(value="select count(*) from (SELECT a.id FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id "
+ "AND a.customer_id = ?1 AND ( b.STATUS = 1)) as temp",nativeQuery=true)
int findAllCountByCustomerIdAndAucLotStatus1(Long customerId); //进行中状态
@Query(value="SELECT a.id,a.auc_id,a.crt_time,a.crt_user_id,a.crt_user_name,a.customer_id,a.upd_time,a.upd_user_id,a.upd_user_name FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id "
+ "AND a.customer_id = ?1 AND ( b.STATUS = 2) order by a.crt_time desc limit ?2,?3",nativeQuery=true)
List<AucAttention> findAllByCustomerIdAndAucLotStatus2(Long customerId,
int i, int rows); @Query(value="select count(*) from (SELECT a.id FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id "
+ "AND a.customer_id = ?1 AND ( b.STATUS = 2)) as temp",nativeQuery=true)
int findAllCountByCustomerIdAndAucLotStatus2(Long customerId); //已结束状态
@Query(value="SELECT a.id,a.auc_id,a.crt_time,a.crt_user_id,a.crt_user_name,a.customer_id,a.upd_time,a.upd_user_id,a.upd_user_name FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id "
+ "AND a.customer_id = ?1 AND ( b.STATUS != 1 AND b.STATUS != 2) order by a.crt_time desc limit ?2,?3",nativeQuery=true)
List<AucAttention> findAllByCustomerIdAndAucLotStatus3(Long customerId,
int i, int rows); @Query(value="select count(*) from (SELECT a.id FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id "
+ "AND a.customer_id = ?1 AND ( b.STATUS != 1 AND b.STATUS != 2)) as temp",nativeQuery=true)
int findAllCountByCustomerIdAndAucLotStatus3(Long customerId); //默认状态
@Query(value="SELECT a.id,a.auc_id,a.crt_time,a.crt_user_id,a.crt_user_name,a.customer_id,a.upd_time,a.upd_user_id,a.upd_user_name FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id "
+ "AND a.customer_id = ?1 order by a.crt_time desc limit ?2,?3",nativeQuery=true)
List<AucAttention> findAllByCustomerIdAndAucLotStatus(Long customerId,
int i, int rows); @Query(value="select count(*) from (SELECT a.id FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id "
+ "AND a.customer_id = ?1 ) as temp",nativeQuery=true)
int findAllCountByCustomerIdAndAucLotStatus(Long customerId);
4.优化之后,公用一个SQL语句即可。
控制器方法:
/**
* 返回所有的我关注的拍品列表 筛选条件 未开始,进行中,已结束
*
* 1 未开始 2 进行中 3 已结束
*
* @param request
* @return
*/
@RequestMapping(value = "/auctionFocusOnList", method = RequestMethod.POST)
@ResponseBody
public ResultDTO<Map<String, Object>> findAllMyFocusOn(Integer checkStatus, int page, int rows,
HttpServletRequest request) {
if (checkStatus == null) {
checkStatus = 0;
} Map<String, Object> retMap = null;
List<Map<String, Object>> focusOnList = new ArrayList<>(); // 获取session中的登陆对象
Customer user = (Customer) request.getSession().getAttribute("user"); List<AucAttention> aucAttentionList = null; // 获取所有的关注的拍品的条件
if (null != user) {
Long customerId = Long.valueOf(user.id());
int total = 0; if (checkStatus == 1) {// 未开始
aucAttentionList = aucAttentionRepository.findAllByCustomerIdAndAucLotStatus(customerId,
(page - 1) * rows, rows, 1, 0, 0, 0, 0, 0, 0);
total = aucAttentionRepository.findAllCountByCustomerIdAndAucLotStatus(customerId, 1, 0, 0, 0, 0, 0, 0); } else if (checkStatus == 2) {// 进行中 aucAttentionList = aucAttentionRepository.findAllByCustomerIdAndAucLotStatus(customerId,
(page - 1) * rows, rows, 2, 0, 0, 0, 0, 0, 0);
total = aucAttentionRepository.findAllCountByCustomerIdAndAucLotStatus(customerId, 2, 0, 0, 0, 0, 0, 0);
} else if (checkStatus == 3) {// 已结束 aucAttentionList = aucAttentionRepository.findAllByCustomerIdAndAucLotStatus(customerId,
(page - 1) * rows, rows, 3, 4, 5, 6, 7, 0, 0);
total = aucAttentionRepository.findAllCountByCustomerIdAndAucLotStatus(customerId, 3, 4, 5, 6, 7, 0, 0);
} else {// 默认情况 aucAttentionList = aucAttentionRepository.findAllByCustomerIdAndAucLotStatus(customerId,
(page - 1) * rows, rows, 1, 2, 3, 4, 5, 6, 7);
total = aucAttentionRepository.findAllCountByCustomerIdAndAucLotStatus(customerId, 1, 2, 3, 4, 5, 6, 7);
} Map<String, Object> map = null;
AucLot aucLot = null;
int auctionStatus = 4;
String startTime = null;
String endTime = null;
String aucLotTime = null;
SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy.MM.dd");// 格式化时间 for (AucAttention aucAttention : aucAttentionList) {
map = new HashMap<String, Object>(); aucLot = aucLotRepository.findOne(aucAttention.aucId()); if (aucLot != null) {
startTime = dateFormater.format(aucLot.startTime());// 拍卖开始时间
endTime = dateFormater.format(aucLot.endTime());// 拍卖结束时间 // 定义拍卖时间,开始时间和结束时间的拼接
if (startTime.equals(endTime)) {
aucLotTime = startTime;
} else {
aucLotTime = startTime + "-" + endTime;
} map.put("aucLotId", aucLot.id());// 拍卖id
map.put("goodsName", aucLot.goodsName());// 拍品名称
map.put("aucLotTime", aucLotTime);// 拍品时间
map.put("status", aucLot.status());// 拍卖状态 // 关注的拍品的拍卖资质对象的条件
Specification<AucBrand> aucBrandSpec = (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<Predicate>();
if (null != aucAttention) {
Predicate predicate = cb.equal(root.get(AucBrand_.customerId), aucAttention.customerId());// 竞买人id
predicates.add(predicate);
}
if (null != aucAttention) {
Predicate predicate = cb.equal(root.get(AucBrand_.aucLot).get(AucLot_.id),
aucAttention.aucId());// 拍品id
predicates.add(predicate);
}
if (!predicates.isEmpty()) {
return cb.and(predicates.toArray(new Predicate[0]));
} else {
return null;
}
}; List<AucBrand> aucBrandList = aucBrandRepository.findAll(aucBrandSpec);
if (aucBrandList != null && aucBrandList.size() > 0) {
AucBrand aucBrand = aucBrandList.get(0);
if (aucBrand != null) {
boolean bailPayed = aucBrand.isBailPayed();// 保证金是否支付
int isDeal = aucBrand.isDeal();// 成交状态
int auditType = aucBrand.auditType();// 审核状态
map.put("bailPayed", bailPayed);
map.put("auditType", auditType);
// 获取保证金主键id值
List<SettlementBail> settlementBails = settlementBailRepository
.findAllByBrandId(aucBrand.id());
if (settlementBails != null && settlementBails.size() > 0) {
SettlementBail settlementBail = settlementBails.get(0);
if (settlementBail != null) {
map.put("settlementBailId", settlementBail.id());
} else {
map.put("settlementBailId", null);
}
} // 判断竞拍情况
if (bailPayed == true) {
// 成交
if (isDeal == 1) {
auctionStatus = 1;// "已成交"
} else {
auctionStatus = 2;// "已参拍"
}
} else {
// 保证金未支付
auctionStatus = 3;// "已报名"
}
map.put("auctionStatus", auctionStatus);
} else {
// 没有参拍资质
auctionStatus = 4;// "未报名"
map.put("bailPayed", null);
map.put("auditType", null);
map.put("settlementBailId", null);
map.put("auctionStatus", auctionStatus);// 竞拍情况
}
} else {
auctionStatus = 4;// "未报名"
map.put("bailPayed", null);
map.put("auditType", null);
map.put("settlementBailId", null);
map.put("auctionStatus", auctionStatus);// 竞拍情况
}
focusOnList.add(map);
} else {
continue;
}
}
retMap = new HashMap<String, Object>();
retMap.put("focusOnList", focusOnList);
retMap.put("total", total);
return new ResultDTO<Map<String, Object>>(retMap);
} else {
return new ResultDTO<Map<String, Object>>(700, "用户未登录", null);
}
}
SQL语句:
@Query(value="SELECT a.id,a.auc_id,a.crt_time,a.crt_user_id,a.crt_user_name,a.customer_id,a.upd_time,a.upd_user_id,a.upd_user_name FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id "
+ "AND a.customer_id = ?1 AND ( b.STATUS = ?4 or b.STATUS = ?5 or b.STATUS = ?6 or b.STATUS = ?7 or b.STATUS = ?8 or b.STATUS = ?9 or b.STATUS = ?10) order by a.crt_time desc limit ?2,?3",nativeQuery=true)
List<AucAttention> findAllByCustomerIdAndAucLotStatus(Long customerId,
int i, int rows,int checkStatus1,int checkStatus2,int checkStatus3,int checkStatus4,int checkStatus5,int checkStatus6,int checkStatus7); @Query(value="select count(*) from (SELECT a.id FROM auc_attention a,auc_lot b WHERE a.auc_id = b.id "
+ "AND a.customer_id = ?1 AND ( b.STATUS = ?2 or b.STATUS = ?3 or b.STATUS = ?4 or b.STATUS = ?5 or b.STATUS = ?6 or b.STATUS = ?7 or b.STATUS = ?8)) as temp",nativeQuery=true)
int findAllCountByCustomerIdAndAucLotStatus(Long customerId,int checkStatus1,int checkStatus2,int checkStatus3,int checkStatus4,int checkStatus5,int checkStatus6,int checkStatus7);
一次SQL查询语句的优化的更多相关文章
- 深入MySQL(四):MySQL的SQL查询语句性能优化概述
关于SQL查询语句的优化,有一些一般的优化步骤,本节就介绍一下通用的优化步骤. 一条查询语句是如何执行的 首先,我们如果要明白一条查询语句所运行的过程,这样我们才能针对过程去进行优化. 参考我之前画的 ...
- SQL查询语句优化的实用方法
查询语句的优化是SQL效率优化的一个方式,可以通过优化sql语句来尽量使用已有的索引,避免全表扫描,从而提高查询效率.最近在对项目中的一些sql进行优化,总结整理了一些方法. 1.在表中建立索引,优先 ...
- 浅谈SQL优化入门:1、SQL查询语句的执行顺序
1.SQL查询语句的执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_ ...
- sql查询语句优化
http://www.cnblogs.com/dubing/archive/2011/12/09/2278090.html 最近公司来一个非常虎的dba 10几年的经验 这里就称之为蔡老师吧 在征得 ...
- 高性能MySql进化论(十一):常见查询语句的优化
总结一下常见查询语句的优化方式 1 COUNT 1. COUNT的作用 · COUNT(table.filed)统计的该字段非空值的记录行数 · ...
- oracle中sql查询语句的执行顺序
查询语句的处理过程主要包含3个阶段:编译.执行.提取数据(sql查询语句的处理主要是由用户进程和服务器进程完成的,其他进程辅助配合) 一.编译parse 在进行编译时服务器进程会将sql语句的正文放入 ...
- MySQL 笔记整理(1) --基础架构,一条SQL查询语句如何执行
最近在学习林晓斌(丁奇)老师的<MySQL实战45讲>,受益匪浅,做一些笔记整理一下,帮助学习.如果有小伙伴感兴趣的话推荐原版课程,很不错. 1) --基础架构,一条SQL查询语句如何执行 ...
- 【转】同一个SQL查询语句,为什么使用到的索引不同?
问: 同一个SQL查询语句,只是修改where条件中的一个值,为什么使用到的索引情况也会不同?谢谢! 1) explain执行结果,如下图: 2) 表中的数据如下图: 3) 表结构如下图: 4) 创建 ...
- Oracle执行SQL查询语句的步骤
Oracle执行SQL查询语句的步骤 如果用户在SQL*Plus下输入了如下查询语句:SELECT * FROM dept: 查询语句的处理主要包括三个过程:编译(parse).执行(execute) ...
随机推荐
- EF – 7.一对多关联
5.6.8 <一对多关联(上)> 5.6.9 <一对多关联(下)> 一对多的关联,可以说是整个数据库应用程序中最常见的一种关联类型了,因此,必须高度重视这种关联类型CRUD的实 ...
- day2 购物商城
购物商城 商品展示.价格 买,加入购物车 付款,钱不够.(减商品,充值)
- 牛客练习赛19 C-托米航空公司
思路:轮廓线dp,找bug找死我了. #include<bits/stdc++.h> #define LL long long #define fi first #define se se ...
- SaltStack的配置管理--jinja (七)
SaltStack的配置管理--jinja 需求场景:使用jinja模板,让各节点的httpd都监听在本机的ip [root@7mini-node1 apache]# vim files/httpd. ...
- linux中使用rm命令将文件移到回收站的方法
今天在终端下,看到我的用户目录下有个-的文件夹(maven生成),相要删除收回点空间,习惯性的用命令 rm -rf ~ ,一回车,猛然想起的时候已经来不及了,世界一下子清静了,想死的心都有了! 没错, ...
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)I - 没有名字
题目描述 tabris实在是太菜了,没打败恶龙,在绿岛也只捡到一块生铁回去了,为了不在继续拉低acimo星球的平均水平逃离地球,来到了Sabi星球. 在这里tabris发现了一种神奇的生物,这种生物不 ...
- go chapter 9 - 反射
https://www.cnblogs.com/diegodu/p/5590133.html // 反射,根据字段名设置值 package entities import( "reflect ...
- centos 7 安装python3.5
1.安装编译环境 yum groupinstall 'Development Tools' yum install zlib-devel bzip2-devel openssl-devel ncure ...
- FastReport.Net使用:[20]条码控件使用
在日常生活中,条码用的越来越多,“扫一扫”目前是非常的流行.报表设计也要跟上时代,打印出条码,方便信息流转. FastReport对条码的支持很不错,支持很多类型的条码,还包括二维码. 几个常见问题 ...
- 2018ECfinal J. Philosophical Balance
2018ECfinal J. Philosophical Balance 题目大意: 给出一个字符串 \(s\) ,你需要给每一个 \(i\) 一个 \([0,1]\) 之间的权值 \(k_i\) , ...