MySQL:IN查询按IN集合顺序显示

工作中新测出来的bug,经查找,发现场景是这样子的:
一个课程在添加多个课件的时候,课件排列的顺序对应的课件id是3099,2727,2485,2488,2487,3029,
因此代码里我使用了IN查询,SQL语句如下:
select * from file_info where id in(3099,2727,2485,2488,2487,3029);

结果如下图:

 

问题来了,in查询默认是按id升序排列的,但我添加的课件并不是按照id大小顺序排列的,我需要拿到的是按照给出的ids顺序查出的结果。
解决方案一:
select * from file_info where id in(3099,2727,2485,2488,2487,3029) order by field(id, 3099,2727,2485,2488,2487,3029);

这是说,先in查询,把查出的记录的id在FIELD列表里面进行查找,以位置作为排序依据返回结果。

解决方案二:

select * from file_info where id in(3099,2727,2485,2488,2487,3029)
order by INSTR(',3099,2727,2485,2488,2487,3029,', CONCAT(',',id,','));

instr函数为字符查找函数,查找一个字符串在另一个字符串中首次出现的位置,其中逗号的作用是精确匹配,没有逗号,匹配就会出现问题。

执行两个两个SQL,结果相同,如下图:

 

后记:

  老实讲,instr的知识点我有点晕,再加上一个不慎就会写错,远不如field来的简便;

  另外两个语句的执行时间分别是:0.007s和0.006秒,消耗性能相差不多,所以我采取了第一种写法改正了bug。

转载于:https://www.cnblogs.com/luckyliulin/p/11509571.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值