一次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) ...
随机推荐
- Android学习笔记(四) 定时器Timer
Android考虑到线程安全问题,不允许在线程中执行UI线程. 所以在线程中不允许有UI操作 可以利用Handler机制来接收Timer每隔一秒发出的信息,也可以直接利用handler机制的 1.方法 ...
- Python解释器【转载】
原文链接 0x01 简介 当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件.要运行代码,就需要Python解释器去执行.py文件. 0x02 Python ...
- c++ primer 6 语句
没什么重要的东西,异常处理在17章再讲吧
- python开发学习-day02(元组、字符串、列表、字典深入)
s12-20160109-day02 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...
- 获取对象的key【键】和分别获取数组的key【键】和值
一.先说对象,如何获取key[键]: var obj={ name:"websong", qq:289483936 } 想要获取这个obj对象的键“name”和"qq&q ...
- 【笔试题】怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串?
笔试题 怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串? import java.io.UnsupportedEncodingException; public clas ...
- c#多线程实现函数同步运行
我们假设有方法run1()和run2(),耗时都比较大,实现他们同步运行将大大提高程序的效率,在这里考虑使用多线程的方法. 首先添加引用,定义bool型i,j为false. using System. ...
- linux 把ls -R格式化成树状结构
谁能写脚本把linux中的ls -R命令的结果格式化成树状结构? 最好是shell脚本!欢迎讨论! 参与讨论有可能意外获取iPhone6哦~~
- CodeForces 805B 3-palindrome
构造. $bbaabbaabbaa......$输出前$n$个即可,这样不需要用到$c$,而且任意相邻三个都不会是回文. #include <cstdio> #include <cm ...
- URAL 1997 Those are not the droids you're looking for
二分图的最大匹配. 每一个$0$与$1$配对,只建立满足时差大于等于$a$或者小于等于$b$的边,如果二分图最大匹配等于$n/2$,那么有解,遍历每一条边输出答案,否则无解. #include< ...