我希望按照一定的顺序进行订购。我知道我可以修改整个数据库,但我需要修改整个代码库。
我所拥有的是一个名为'status'的表'游戏'中的一列。
因此...
SELECT *
FROM games
ORDER BY status ASC -- Will retrieve results going from 0 then 1 then 2
我正在寻找的是能够按1然后0然后2来订购。
任何想法???
答案 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
SELECT g.*
FROM GAMES g
ORDER BY FIND_IN_SET(g.status, '0,1,2')
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是一个可能存放在内存中的小表,因此它很小。优点是您可以在不触及代码的情况下即时更改排序顺序。使用适当的排序顺序添加新状态值也很容易。
分享并享受。