MySQL – 查询按IN的顺序输出结果

本文介绍了MySQL中使用IN子句进行查询时,默认不会按指定顺序返回结果的问题,并提供了三种解决方法:使用FIND_IN_SET函数、构建顺序ID表进行左连接及使用UNION。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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 建立一个派序列:

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

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 查询结果集:

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     -> 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 +-----+------+--------+
27 9 rows in set (0.00 sec)

三、使用 UNION :

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值