今天遇到的小问题

最近开发过程中遇到了写小问题,在这里做一简单总结。
一.在不修改数据库状态的基础上按照自己后指定的顺序排序查询。
数据库spread_status 推广状态 0未推广 1推广中 2 已结束 3 已取消 4未开始 5暂停中’,页面要求按照145230的顺序排序,有的小伙伴会说,调整一下状态对应的数字然后排序多简单,但是项目运行4年,数据量大得惊人,改数据是不可能的,那只能重新排序处理。
之前了解过case when但一直没怎么用过,今天正好用到了。
处理方式有多种,XML处理方式:
先看下SQL

  SELECT
  t.*,
  m.type,
  p.park_id,
  (SELECT COUNT(*) FROM parking_ths_active_spread_item pm WHERE t.id = pm.active_spread_id and `status`=1) AS toufangYemian,
  (SELECT COUNT(*) FROM parking_ths_active_spread_park ps WHERE t.id = ps.active_spread_id  and `status`=1) AS toufangChechang
  FROM
  parking_ths_active_spread t
  LEFT JOIN parking_ths_active_spread_item m ON t.id = m.active_spread_id
  LEFT JOIN parking_ths_active_spread_park p ON t.id = p.active_spread_id
  where t.`status`=1
 
  GROUP BY t.id
  order by (case
  when  t.spread_status=1 then 1
  when  t.spread_status=4 then 2
  when  t.spread_status=5 then 3
  when  t.spread_status=2 then 4
  when  t.spread_status=3 then 5
  when  t.spread_status=0 then 6
  else 0 end
  )
  asc, t.start_time desc

case when 是条件判断函数,特定字段可以根据一定的规则操作其内容,
格式1:

select + 要显示的字段名,
case + 要操作的字段名
when '要操作的字段名中的具体内容'    then 具体修改指令
else 剩余的字段名修改指令
end (别名+"")
from 表名称

格式2:

select +要显示的字段名,
case 
when  字段名 =  '要操作的字段名或表达式'   then 具体指令
else 否则如何
end(这里可以加上自己设置的字段名称)
from 表名称

在SQL里重新定义了排序字段临时起别名,而后对别名的数字排序,达到效果。

impl处理方式
1.比较器,在实体类中新建变量,在impl返回的集合遍历,新建变量的值为循环的index,然后定义比较器根据自定义变量进行排序。
2.比较器

  Map<Integer, Integer> statusUpdate = new HashMap<>(16);  定义map键为指定顺序,value为之前顺序
    statusUpdate.put(1, 1);
    statusUpdate.put(4, 2);
    statusUpdate.put(5, 3);
    statusUpdate.put(2, 4);
    statusUpdate.put(3, 5);
    statusUpdate.put(0, 6);

 list.sort(new Comparator<ThsActiveSpread>() {
        @Override
        public int compare(ThsActiveSpread o1, ThsActiveSpread o2) {// 两对象
            int o1Status = Optional.ofNullable(o1.getSpreadStatus()).orElse(0); //默认值防止空指针
            int o2Status = Optional.ofNullable(o2.getSpreadStatus()).orElse(0);
            int o1StatusUpdate = statusUpdate.get(o1Status);//map取出的key对应对象中的值
            int o2StatusUpdate = statusUpdate.get(o2Status);
            if (o1StatusUpdate > o2StatusUpdate){//145230顺序排列
                return 1; //正序 
            } else if (o1StatusUpdate == o2StatusUpdate){
                return 0; //随意
            } else {
                return -1;//倒序
            }
        }
    });
  List<ThsActiveSpread> list1 = list.stream().sorted(Comparator.comparing(ThsActiveSpread::getSpreadStatus, ((o1, o2) -> {
            Integer o1StatusUpdate = statusUpdate.getOrDefault(o1, 0);
            Integer o2StatusUpdate = statusUpdate.getOrDefault(o2, 0);
            return o1StatusUpdate.compareTo(o2StatusUpdate);
        }))).collect(Collectors.toList());

二:数据库加索引提高查询速度。
数据库按照索引查询快,内容查询慢,主键自带索引,按主键查询很快,内容加索引提高查询速度。
在这里插入图片描述

在sql之前EXPLAIN 会显示当前语句那一块比较费时。酌情配置索引。
1.索引类型:
normal:表示普通索引,也是用的最多的。
unique:表示唯一的,不允许重复的索引,如果
该字段信息保证不会重复例如身份证号用作索引时,可设置为unique
full textl: 表示 全文搜索的索引。 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。
2.索引方式
HASH和BTREE mysql默认BTREE,"=,>,>=,<,<=、BETWEEN、Like"等操作符查询效率较高,HASH用于对等比较,如"=“和” <=>"。

就先到这吧。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值