在MYSQL中,如何选择多行并按指定的顺序返回它们?
我知道我可以像这样选择多行:在MYSQL中,如何选择多行并按指定的顺序返回它们?,sql,mysql,Sql,Mysql,我知道我可以像这样选择多行: select * FROM table WHERE id in (1, 2, 3, 10, 100); 我按顺序返回结果:1,2,3,10100 但是,如果我需要按特定顺序返回结果,该怎么办?当我尝试这个: select * FROM table WHERE id in (2, 100, 3, 1, 10); 我仍然以相同的顺序返回结果:1、2、3、10、100 有没有办法按照我要求的顺序返回结果 (由于网站的设置方式存在限制,不允许我使用另一个字段值进行订购)
select * FROM table WHERE id in (1, 2, 3, 10, 100);
我按顺序返回结果:1,2,3,10100
但是,如果我需要按特定顺序返回结果,该怎么办?当我尝试这个:
select * FROM table WHERE id in (2, 100, 3, 1, 10);
我仍然以相同的顺序返回结果:1、2、3、10、100
有没有办法按照我要求的顺序返回结果
(由于网站的设置方式存在限制,不允许我使用另一个字段值进行订购)除非您能够按进行订购,否则没有保证的方式 您得到的排序是由于
MySQL
执行查询的方式:它将range
中的列表定义的范围内的所有扫描组合成一个range
扫描
通常,您可以使用以下方式之一强制执行订单:
创建一个包含值和分拣机的临时表,用您的值填充该表,然后通过分拣机进行排序
:
CREATE TABLE t_values (value INT NOT NULL PRIMARY KEY, sorter INT NOT NULL)
INSERT
INTO t_values
VALUES
(2, 1),
(100, 1),
(3, 1),
(1, 1),
(10, 1);
SELECT m.*
FROM t_values v
JOIN mytable m
ON m.id = v.value
ORDER BY
sorter
对在位行集执行相同的操作:
SELECT m.*
FROM (
SELECT 2 AS value, 1 AS sorter
UNION ALL
SELECT 100 AS value, 2 AS sorter
UNION ALL
SELECT 3 AS value, 3 AS sorter
UNION ALL
SELECT 1 AS value, 4 AS sorter
UNION ALL
SELECT 10 AS value, 5 AS sorter
)
JOIN mytable m
ON m.id = v.value
ORDER BY
sorter
使用CASE
子句:
SELECT *
FROM mytable m
WHERE id IN (1, 2, 3, 10, 100)
ORDER BY
CASE id
WHEN 2 THEN 1
WHEN 100 THEN 2
WHEN 3 THEN 3
WHEN 1 THEN 4
WHEN 10 THEN 5
END
可以强制执行顺序,但只能基于一列或多列的值
要按示例中指定的顺序返回行,需要添加第二列,称为“sortkey”,其值可用于按所需顺序对行进行排序,
使用ORDERBY子句。在您的示例中:
Value Sortkey
----- -------
1 4
2 1
3 3
10 5
100 2
select value FROM table where ... order by sortkey;
你的措辞让我不确定使用ORDER BY是完全不可能的,还是仅仅通过其他字段进行排序。。。因此,冒着提交无用答案的风险,在这种情况下,您通常会这样排序结果
SELECT *
FROM table
WHERE id in (2, 100, 3, 1, 10)
ORDER BY FIELD (id, 2, 100, 3, 1, 10)
Ty W下面的解决方案是#3的一个改进版(以更短的方式),只要集很小,就可以了,但用子查询替换“in”集,表中就必须有一个sortkey列。