MySQL排序问题求助!

6

我希望按照特定顺序进行排序。我知道可以修改整个数据库,但那样就需要修改整个代码库了。

我的问题是,我在数据库中的一个名为 'games' 的表格中有一列名为 'status'。

因此...

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

我需要的是能够按照1、0、2的顺序排序。您有什么想法吗?
4个回答

4

如果我理解正确,使用 CASE 表达式

  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函数
  SELECT g.* 
    FROM GAMES g
ORDER BY FIND_IN_SET(g.status, '0,1,2')

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

这本来是正确的答案,但是提问者要求顺序为1、0、2。 - ajacian81
@ajacian81: 前面的评论有矛盾之处,但我认为这些示例的一致性足以让您了解如何根据需求进行更改。 - OMG Ponies

2
您可以使用 FIELD() 函数:
SELECT *
FROM games
ORDER BY FIELD(status, 1, 0, 2)

但是最好能更详细地解释一下你想做什么,即你的表格包含哪些内容。


0
另一种选择是为状态列设置一个验证表,例如VAL_GAME_STATUS。GAMES.STATUS将是对VAL_GAME_STATUS的外键,而VAL_GAME_STATUS可能如下所示:
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是一个可以放在内存中的小表,因此这只是一个小问题。优点是您可以在不触及代码的情况下随时更改排序顺序。添加具有适当排序顺序的新状态值也很容易完成。
分享并享受。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接