Mysql in查询 结果集 乱序

SQL: select * from table where id IN (3,6,9,1,2,5,8,7);

这样的情况取出来后,其实,id还是按1,2,3,4,5,6,7,8,9,排序的,但如果我们真要按IN里面的顺序排序怎么办?SQL能不能完成?是否需要取回来后再foreach一下?其实mysql就有这个方法

sql: select * from table where id IN (3,6,9,1,2,5,8,7) order by field(id,3,6,9,1,2,5,8,7);

出来的顺序就是指定的顺序了。。。。

写法二: select * from table where id in (3,6,9,1,2,5,8,7) order by find_in_set(id,'3,6,9,1,2,5,8,7');

但是这么写 explain  select * from table where id IN (3,6,9,1,2,5,8,7) order by field(id,3,6,9,1,2,5,8,7);

会Using filesort  导致查询效率降低

所以可以这样  把结果集查询出来 自己sortList employees = newArrayList<>();employees.add(newEmployee(123,"Jack","Johnson",LocalDate.of(1988,Month.APRIL,12)));employees.add(newEmployee(345,"Cindy","Bower",LocalDate.of(2011,Month.DECEMBER,15)));employees.add(newEmployee(567,"Perry","Node",LocalDate.of(2005,Month.JUNE,07)));employees.add(newEmployee(467,"Pam","Krauss",LocalDate.of(2005,Month.JUNE,07)));employees.add(newEmployee(435,"Fred","Shak",LocalDate.of(1988,Month.APRIL,17)));employees.add(newEmployee(678,"Ann","Lee",LocalDate.of(2007,Month.APRIL,12)));employees=employees.stream().sorted((e1,e2) -> e1.getHireDate().compareTo(e2.getHireDate())).collect(Collectors.toList());

接着:

描述下问题的由来

存在条件:

1. 有一个合辑表 A, 有一个内容表 C.   C表中有一个列a_id 关联两个表

2. A表中有3000条数据 C表中有2w条数据  合辑表中有的有内容 有的没有内容

需求:

1. 分页显示合辑列表, 每个合辑有个ContentSize字段 表示合辑的内容数量.

解析步骤:

分两次查询: 第一次查分页. 第二次查合辑的内容数量.

1.分页sql 忽略.

2.统计list 合辑id列表中的 每合辑对应的内容数量

当时想到了第一种方式  连接查询 count in group by  order by id的顺序  (次方法有两点不好1. left join 连表 效率低 2. 结果集顺序 Using filesort 效率低)@Query(value= "select count(c.id) from abm_album a left join abm_album_content c on a.id=c.album_id and c.is_deleted =:isDeleted where a.id in (:albumIds) group by a.id order by field(a.id,:albumIds) ",nativeQuery= true)

publicList countByAlbumIdsAndIsDeleted(@Param("isDeleted")Integer isDeleted,@Param("albumIds")List albumIds);---------------------------方式一:解析SQL如下-------------------------select

count(c.id)

from

abm_album a left join abm_album_content c

on a.id=c.album_id and c.is_deleted =0where

a.id in(5138822,5160757,5000142,5160750,5159885)

group by a.id

order by field(a.id,5138822,5160757,5000142,5160750,5159885)@Query(value= "select c.album_id ,count(c.id) from abm_album_content c where c.is_deleted =:isDeleted and c.album_id in (:albumIds) group by c.album_id ",nativeQuery= true)

publicList countMapByAlbumIdsAndIsDeleted(@Param("isDeleted")Integer isDeleted,@Param("albumIds")List albumIds);---------------------------方式二:解析SQL如下-------------------------select

c.album_id ,count(c.id)

from abm_album_content cwhere

c.is_deleted =0

and c.album_id in(5138822,5160757,5000142,5160750,5159885)

group by c.album_id---------------------------查询结果处理-------------------------List datas = albumRepository.find(album,page.getStart(),page.getPageSize(),sort);if(null!=datas && datas.size()>0){

//设置稿件数量 try{

List ids= datas.stream().map(Album::getId).collect(Collectors.toList()); // 方式一 list查询 in带顺序 然后顺序set sql关联查询 执行效率低/*List bigIntegers = albumContentRepository.countByAlbumIdsAndIsDeleted(AlbumConstant.UNDELETED, ids);if(datas.size()==ids.size()&&datas.size()==bigIntegers.size()){for (int i=0;i 循环设置 效率高 List maps = albumContentRepository.countMapByAlbumIdsAndIsDeleted(AlbumConstant.UNDELETED,ids); Map countMap=newHashMap<>(); maps.forEach(map->countMap.put((Integer)map[0],(BigInteger)map[1])); datas.forEach(data-> {

if(null!=countMap.get(data.getId())){

data.setContentsCount(countMap.get(data.getId()).intValue()); }else{

data.setContentsCount(0); }

}); }catch(Exception e){

log.error("查询合辑下稿件数量出错",e); }

}

//set结果集page.setDatas(datas);

总结:

1. in 查询 返回的结果集 如果有数据不存在的时候 返回结果集的个数 和合辑id_list的size 是不一样的.

2. 能单表查询 尽量不要链表查询

OK. 到此结束 小记...

mysql in 排序 无数据混乱_mysql in查询 结果乱序 引发的思考相关推荐

  1. mysql in 排序 无数据混乱_解决 mysql in 查询排序问题

    Bad Request - Request Too Long Bad Request - Request Too Long HTTP Error 400. The size of the reques ...

  2. mysql先排序再分组筛选_mysql 怎样先排序再分组

    权游游牧族:众所周知!一句SqL语句不能先排序再分组.所以这里给出几个案例 --表结构-- create table `shop` ( `id` int (10) PRIMARY KEY, `shop ...

  3. mysql中的参数如何调试_mysql 查询优化 ~ 查询参数调节

    mysql优化基础之参数调节 一 简介:我们谈谈如何调节mysql参数加速查询 二 相关参数 1 排序参数 sort_buffer_size 当出现order by时会利用到这个参数,当数据量超过内存 ...

  4. mysql查找有小数点的数据_MySQL中查询中位数?

    导读:计算中位数可能是小学的内容,然而在数据库查询中实现却并不是一件容易的事.我们今天就来看看都有哪些方法可以实现. 注:本文所用MySQL版本无限制,所列题目均来源于LeetCode. LeetCo ...

  5. mysql的sid号怎么查_mysql表查询练习

    准备数据 create table book( id int primary key auto_increment, name varchar(16), price int ); create tab ...

  6. mysql 所有表的字段信息_mysql如何查询所有表和字段信息

    mysql查询所有表和字段信息的方法: 1.根据库名获取所有表的信息 SELECT * FROM information_schema.`TABLES` WHERE TABLE_SCHEMA = 'e ...

  7. mysql的or能去重吗_mysql条件查询中AND与OR联合使用的注意事项!

    mysql查询中经常会用到AND与OR一起使用的情况,可如果写法不对,往往会起到相反的效果,这不,前几天就碰到了,最后测试果然提了一堆bug!!!! 废话就不多说了,主要总结一下几点: 一 当mysq ...

  8. mysql统计姓名为小明_Mysql 统计查询相同字段只统计一条

    ORDER表 ID      NUMBER          users_name 1        1XC                             小明 2        1XC   ...

  9. mysql如何更新两条数据_mysql根据查询结果批量更新多条数据(插入或更新)

    mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对 ...

最新文章

  1. 优化 AWSTATS N种方法验证
  2. 浅谈vue,小程序,react基础绑定值
  3. rust(19)-进制
  4. Mybatis—多表查询
  5. 微信小程序调试之【不在以下合法域名列表中】
  6. Oracle 20c 新特性:数据泵 expdp / impdp 的EXCLUDE和CHECKSUM增强
  7. python脚本性能分析
  8. 蓝桥杯2019年第十届C/C++省赛B组第四题-数的分解
  9. angularjs自动加载和手动加载
  10. CSS深入理解之border
  11. nagios搭建和邮件短信报警设置
  12. oracle学习资料大全
  13. 面包屑导航条实现三级分类查询
  14. 网页设计中的中国传统色彩速查表 颜色值
  15. 二维码扫码登录是什么原理
  16. GIT提交错分支,push错分支怎么办
  17. 支持自动识别快递公司批量查询物流、一键导出
  18. 解决Chrome无法访问此网站或无法显示此网页问题
  19. 【数据库】聊一下数据库的锁机制
  20. matlab nntool 使用步骤: (以p4.3 为例),Matlab_nntool_应用实例

热门文章

  1. graphpad分组百分比柱状图_如何用GraphPad Prism 8.0绘制分组散点图与柱状图共存图?...
  2. 哈尔滨工业大学计算机复试英语,考研复试 | 哈尔滨工业大学复试经验贴
  3. 溯本清源!天九共享用责任打造安全的投资平台
  4. 豆瓣9.1分:软件开发的201个原则
  5. 三步掩模行业调研报告 - 市场现状分析与发展前景预测
  6. (ESLint)Expected '===' and instead saw '=='
  7. 文件下载图片或者视频及解决保存文件时中文乱码问题
  8. endnote按照apa6th格式复制_APA Format 6th Edition TemplateAPA格式模板第六版.doc
  9. 手把手带你快速实现直播平台源码聊天室
  10. supervisord启动子程序报错Exited too quickly (process log may have details)解决