我知道我可以像这样选择多行:
select * FROM table WHERE id in (1, 2, 3, 10, 100);
我按顺序返回结果:1, 2, 3, 10, 100
但是,如果我需要按特定顺序返回结果怎么办?当我尝试这个时:
select * FROM table WHERE id in (2, 100, 3, 1, 10);
我仍然以相同的顺序返回结果:1, 2, 3, 10, 100
有没有办法按照我要求的确切顺序返回结果?
(由于网站设置的方式存在限制,不允许我使用其他字段值进行ORDER BY)
答案 0 :(得分:7)
你说的方式我不确定使用ORDER BY是完全不可能还是仅仅通过其他领域订购...所以冒着提交无用答案的风险,这就是你通常订购结果的方式在这种情况下。
SELECT *
FROM table
WHERE id in (2, 100, 3, 1, 10)
ORDER BY FIELD (id, 2, 100, 3, 1, 10)
答案 1 :(得分:3)
除非您能够ORDER BY
,否则无法保证。
您获得的排序取决于MySQL
执行查询的方式:它将range
列表定义的范围内的所有IN
扫描合并为一个range
扫描。
通常,您可以使用以下方式之一强制执行订单:
使用值和分拣机创建一个临时表,用sorter
填充您的值和顺序:
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
答案 2 :(得分:1)
您可以强制执行订单,但只能基于一列或多列的值。
要按照您在示例中指定的顺序返回行,您需要添加第二列,称为“sortkey”,其值可用于按所需顺序对行进行排序, 使用ORDER BY子句。在您的示例中:
Value Sortkey
----- -------
1 4
2 1
3 3
10 5
100 2
select value FROM table where ... order by sortkey;