SELECT
是否可以按照预定的顺序做一个陈述,即。仅根据 ID 字段选择 ID 7、2、5、9 和 8并按该顺序返回它们?
这两个语句都以相同的顺序返回它们:
SELECT id FROM table WHERE id in (7,2,5,9,8)
SELECT id FROM table WHERE id in (8,2,5,9,7)
SELECT
是否可以按照预定的顺序做一个陈述,即。仅根据 ID 字段选择 ID 7、2、5、9 和 8并按该顺序返回它们?
这两个语句都以相同的顺序返回它们:
SELECT id FROM table WHERE id in (7,2,5,9,8)
SELECT id FROM table WHERE id in (8,2,5,9,7)
我不认为这是可能的,但在这里找到了一个似乎做你所追求的事情的博客条目:
SELECT id FROM table WHERE id in (7,2,5,9,8)
ORDER BY FIND_IN_SET(id,"7,2,5,9,8");
会给不同的结果
SELECT id FROM table WHERE id in (7,2,5,9,8)
ORDER BY FIND_IN_SET(id,"8,2,5,9,7");
FIND_IN_SET
返回id
给它的第二个参数中的位置,所以对于上面的第一种情况,id
7 在集合中的位置 1,2 在 2 等等 - mysql 内部计算出类似
id | FIND_IN_SET
---|-----------
7 | 1
2 | 2
5 | 3
然后按 的结果排序FIND_IN_SET
。
你最好的选择是:
ORDER BY FIELD(ID,7,2,4,5,8)
......但它仍然很丑。
您能否包含一个将您的 ID 7,2,5,... 映射到序数 1,2,3,... 的 case 表达式,然后按该表达式排序?
所有排序均由 ORDER BY 关键字完成,但您只能按升序和降序排序。如果您使用诸如 PHP 之类的语言,则可以使用一些代码对它们进行相应的排序,但我认为仅使用 MySQL 是不可能的。
这适用于甲骨文。你能在 MySql 中做类似的事情吗?
SELECT ID_FIELD
FROM SOME_TABLE
WHERE ID_FIELD IN(11,10,14,12,13)
ORDER BY
CASE WHEN ID_FIELD = 11 THEN 0
WHEN ID_FIELD = 10 THEN 1
WHEN ID_FIELD = 14 THEN 2
WHEN ID_FIELD = 12 THEN 3
WHEN ID_FIELD = 13 THEN 4
END
您可能需要创建一个带有自动编号字段的临时表并以所需的顺序插入其中。然后对新的自动编号字段进行排序。
这很 hacky(而且可能很慢),但你可以使用 UNION ALL 来获得效果:
SELECT id FROM table WHERE id = 7
UNION ALL SELECT id FROM table WHERE id = 2
UNION ALL SELECT id FROM table WHERE id = 5
UNION ALL SELECT id FROM table WHERE id = 9
UNION ALL SELECT id FROM table WHERE id = 8;
编辑:其他人提到了此处记录的 find_in_set 函数。
嗯,不是真的。你能得到的最接近的可能是:
SELECT * FROM table WHERE id IN (3, 2, 1, 4) ORDER BY id=4, id=1, id=2, id=3
但你可能不想要那个:)
如果没有关于表格中内容的更多信息,很难为您提供任何更具体的建议。
你在这里很快就能得到答案,不是吗……</p>
我问这个的原因是,这是我能想到的避免对复杂的多维数组进行排序的唯一方法。我并不是说排序会很困难,但是如果有更简单的方法可以使用直接 sql 进行排序,那为什么不呢。
一种 Oracle 解决方案是:
SELECT id FROM table WHERE id in (7,2,5,9,8)
ORDER BY DECODE(id,7,1,2,2,5,3,9,4,8,5,6);
这会为每个 ID 分配一个订单号。适用于一小组值。
我能想到的最好的方法是添加第二个列 orderColumn:
7 1
2 2
5 3
9 4
8 5
然后只做一个 ORDER BY orderColumn