您的位置:首页 > 数据库

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

2013-12-10 16:11 483 查看

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

2013-01-16 10:15
506人阅读 评论(1)收藏
举报

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

mysql写法:

SELECT * FROM EVENT WHEREeventId 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,')

---------------------------------------------------------------------------------------------------------------------------------------------

作者:
straul 日期: 2011 年 12 月 16 日 发表评论 (1)
查看评论

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

view source

print?

01
mysql> 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
+-----+--------+
15
9 rows
in

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

转自:@喵了个咪

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

view source

print?

01
mysql> 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
+-----+--------+
15
9 rows
in

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

view source

print?

01
mysql> 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
+-----+--------+------------+

15
9 rows
in

set
(0.00 sec)

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

view source

print?

01
mysql> 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
-> WHEREtable2.
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
+-----+------+--------+
27
9 rows
in

set
(0.00 sec)

三、使用 UNION:

view source

print?

01
mysql> 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
+-----+--------+
23
9 rows
in

set
(0.00 sec)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: