让sql语句不排序,按照in语句的顺序返回结果

让sql语句不排序,按照in语句的顺序返回结果

506人阅读 评论(1) 收藏 举报

有时候我们需要按照in条件里的id顺序输出结果,可sql语句在不加order by的时候是按照asc排序的,下边的sql解决按照in条件顺序的id输出查询结果

mysql写法:

 

SELECT * FROM EVENT WHERE eventId IN(443,419,431,440,420,414,509)  ORDER BY INSTR(',443,419,431,440,420,414,509,',CONCAT(',',eventId,','))

 

oracle写法:

select name from order where oderid in(111,222,333,444,555,666)order by instr('111,222,333,444,555,666',orderid)

 

sqlserver写法:

Select * From Product Where id in (1,1588,15782,9887,54)  Order By charindex(','+ id +',', ',1,1588,15782,9887,54,')

 
 
---------------------------------------------------------------------------------------------------------------------------------------------
 
 
 
 
 
 
 
 
 
 
 
 
发表评论 (1) 查看评论

在用 SELECT 查询的时候,如果用到了 IN ,那么查询结果中的顺序并不是按照 IN 后面所给的顺序返回,而是按照默认的升序排列。如下:

01mysql> SELECT * FROM test WHERE id IN (343,123,32,10,6,981,651,98,129);
02+-----+--------+
03| id  | name   |
04+-----+--------+
05|   6 | URdhMl |
06|  10 | Xl[hJq |
07|  32 | u^]~%p |
08|  98 | Uq`InZ |
09| 123 | yv](Ff |
10| 129 | Owx_mt |
11| 343 | =P3w,m |
12| 651 | zR!yD= |
13| 981 | 5%$EuH |
14+-----+--------+
159 rows in set (0.00 sec)

而如果想要让查询结果按照 IN 里面给的顺序的话,这里有几种方法:

转自:@喵了个咪

一、使用 FIND_IN_SET 建立一个派序列:

01mysql> SELECT * FROM test WHERE id IN (343,123,32,10,6,981,651,98,129) ORDER BY FIND_IN_SET(id,'343,123,32,10,6,981,651,98,129');
02+-----+--------+
03| id  | name   |
04+-----+--------+
05| 343 | =P3w,m |
06| 123 | yv](Ff |
07|  32 | u^]~%p |
08|  10 | Xl[hJq |
09|   6 | URdhMl |
10| 981 | 5%$EuH |
11| 651 | zR!yD= |
12|  98 | Uq`InZ |
13| 129 | Owx_mt |
14+-----+--------+
159 rows in set (0.00 sec)

下面这样可以看到 FIND_IN_SET 的操作方式:也就是 FIND_IN_SET 这个函数返回一个 1-n 递增的字符串,而ORDER BY 这个字符串就相当于是按升序排列了,而这个 1-n 对应着给入的那些 id

01mysql> SELECT id,name,FIND_IN_SET(id,'343,123,32,10,6,981,651,98,129') AS sort_order FROM test WHERE id IN (343,123,32,10,6,981,651,98,129) ORDER BY FIND_IN_SET(id,'343,123,32,10,6,981,651,98,129');
02+-----+--------+------------+
03| id  | name   | sort_order |
04+-----+--------+------------+
05| 343 | =P3w,m |          1 |
06| 123 | yv](Ff |          2 |
07|  32 | u^]~%p |          3 |
08|  10 | Xl[hJq |          4 |
09|   6 | URdhMl |          5 |
10| 981 | 5%$EuH |          6 |
11| 651 | zR!yD= |          7 |
12|  98 | Uq`InZ |          8 |
13| 129 | Owx_mt |          9 |
14+-----+--------+------------+
159 rows in set (0.00 sec)

二、自己构建一个顺序 id 表,左连接 IN 查询结果集:

01mysql> SELECT * FROM (
02    -> SELECT 343 AS id UNION
03    -> SELECT 123 UNION
04    -> SELECT 32 UNION
05    -> SELECT 10 UNION
06    -> SELECT 6 UNION
07    -> SELECT 981 UNION
08    -> SELECT 651 UNION
09    -> SELECT 98 UNION
10    -> SELECT 129
11    -> ) AS table1
12    -> LEFT JOIN test table2 ON table1.id=table2.id
13    -> WHERE table2.id IN (343,123,32,10,6,981,651,98,129);
14+-----+------+--------+
15| id  | id   | name   |
16+-----+------+--------+
17| 343 |  343 | =P3w,m |
18| 123 |  123 | yv](Ff |
19|  32 |   32 | u^]~%p |
20|  10 |   10 | Xl[hJq |
21|   6 |    6 | URdhMl |
22| 981 |  981 | 5%$EuH |
23| 651 |  651 | zR!yD= |
24|  98 |   98 | Uq`InZ |
25| 129 |  129 | Owx_mt |
26+-----+------+--------+
279 rows in set (0.00 sec)

三、使用 UNION :

01mysql> SELECT * FROM test WHERE id=343 UNION
02    -> SELECT * FROM test WHERE id=123 UNION
03    -> SELECT * FROM test WHERE id=32 UNION
04    -> SELECT * FROM test WHERE id=10 UNION
05    -> SELECT * FROM test WHERE id=6 UNION
06    -> SELECT * FROM test WHERE id=981 UNION
07    -> SELECT * FROM test WHERE id=651 UNION
08    -> SELECT * FROM test WHERE id=98 UNION
09    -> SELECT * FROM test WHERE id=129;
10+-----+--------+
11| id  | name   |
12+-----+--------+
13| 343 | =P3w,m |
14| 123 | yv](Ff |
15|  32 | u^]~%p |
16|  10 | Xl[hJq |
17|   6 | URdhMl |
18| 981 | 5%$EuH |
19| 651 | zR!yD= |
20|  98 | Uq`InZ |
21| 129 | Owx_mt |
22+-----+--------+
239 rows in set (0.00 sec)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值