MySQL按顺序排序!

时间:2010-11-07 02:07:07

标签: sql mysql sql-order-by

我希望按照一定的顺序进行订购。我知道我可以修改整个数据库,但我需要修改整个代码库。

我所拥有的是一个名为'status'的表'游戏'中的一列。

因此...

  SELECT * 
    FROM games 
ORDER BY status ASC  -- Will retrieve results going from 0 then 1 then 2

我正在寻找的是能够按1然后0然后2来订购。

任何想法???

4 个答案:

答案 0 :(得分:4)

如果我理解正确,请使用CASE expression

  SELECT g.* 
    FROM GAMES g
ORDER BY CASE g.status 
           WHEN 0 THEN 1
           WHEN 1 THEN 2
           WHEN 2 THEN 3
         END

使用FIND_IN_SET function

  SELECT g.* 
    FROM GAMES g
ORDER BY FIND_IN_SET(g.status, '0,1,2')

使用FIELD function

  SELECT g.* 
    FROM GAMES g
ORDER BY FIELD(g.status, 0, 1, 2)

答案 1 :(得分:2)

您可以使用FIELD():

SELECT *
FROM games
ORDER BY FIELD(status, 1, 0, 2)

但最好再解释一下你想做什么,即你的桌子包含什么。

答案 2 :(得分:0)

我打算发布与OMG小马相同的方法,所以在那里+1。这是我学习这种技术的有用网站:

http://www.shawnolson.net/a/722/mysql-arbitrary-ordering.html

答案 3 :(得分:0)

另一种选择是为状态列提供一个验证表,称为VAL_GAME_STATUS。 GAMES.STATUS是VAL_GAME_STATUS的外键,VAL_GAME_STATUS migt看起来像

CREATE TABLE VAL_GAME_STATUS  -- Oracle format - modify as needed for other DB
  (STATUS      NUMBER PRIMARY KEY,
   DESCRIPTION VARCHAR2(50) NOT NULL UNIQUE,
   SORT_ORDER  NUMBER NOT NULL UNIQUE);

鉴于此,从GAMES获取排序结果的查询变为

SELECT g.*
  FROM GAMES g
INNER JOIN VAL_GAME_STATUS s
  USING (STATUS)
ORDER BY s.SORT_ORDER;

这里的缺点是你需要进行连接才能对数据进行排序,但由于VAL_GAME_STATUS是一个可能存放在内存中的小表,因此它很小。优点是您可以在不触及代码的情况下即时更改排序顺序。使用适当的排序顺序添加新状态值也很容易。

分享并享受。