以预定义的顺序返回查询结果

时间:2008-09-25 16:31:27

标签: mysql sql-order-by

是否可以使用预定的顺序执行SELECT语句,即。选择ID 7,2,5,9和8 并按顺序返回,仅基于ID字段?

语句SELECT id FROM table WHERE id in(7,2,5,9,8);和SELECT id FROM表WHERE id in(8,2,5,9,7);两者都以相同的顺序返回。

11 个答案:

答案 0 :(得分:36)

我不认为这是可能的,但发现blog entry here似乎做了你想要做的事情:

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的结果排序。

答案 1 :(得分:3)

ORDER BY FIELD(ID,7,2,4,5,8)是你最好的选择,但它仍然很难看。

答案 2 :(得分:1)

您是否可以添加一个案例表达式,将您的ID 7,2,5,...映射到序号1,2,3,...然后按该表达式排序?

答案 3 :(得分:0)

所有排序均由ORDER BY关键字完成,但您只能按升序和降序排序。如果您使用的是PHP之类的语言,那么您可以使用某些代码对它们进行相应的排序,但我不认为仅使用MySQL就可以进行排序。

答案 4 :(得分:0)

这适用于Oracle。你能在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

答案 5 :(得分:0)

您可能需要创建一个带有自动编号字段的临时表,并按所需顺序插入其中。然后对新的自动编号字段进行排序。

答案 6 :(得分:0)

它很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;

修改:其他人提到了记录为here的find_in_set函数。

答案 7 :(得分:0)

呃,不是真的。你最近可能得到的可能是:

SELECT * FROM table WHERE id IN (3, 2, 1, 4) ORDER BY id=4, id=1, id=2, id=3

但你可能不希望这样:)

如果没有关于表格内容的更多信息,很难给你更具体的建议。

答案 8 :(得分:0)

你在这附近快速得到答案,不是吗......

我问这个的原因是,这是我能想到避免对复杂的多维数组进行排序的唯一方法。我并不是说排序会很困难,但是如果有一种更简单的方法可以用直接sql来做,那么为什么不呢。

答案 9 :(得分:0)

一个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分配一个订单号。只需一小组值即可正常工作。

答案 10 :(得分:-1)

我能想到的最好是添加第二个Column orderColumn:

7 1
2 2
5 3
9 4 
8 5

然后只需执行ORDER BY orderColumn