我有一张球员桌。每个球员都有一个位置,可以是守门员、后卫、中场或前锋。我想回归所有球员,首先是前锋,然后是中场,然后是后卫,然后是守门员。显然,如果我这样做:
SELECT *
FROM 'Player'
ORDER BY position
防御者将首先返回....
我有一张球员桌。每个球员都有一个位置,可以是守门员、后卫、中场或前锋。我想回归所有球员,首先是前锋,然后是中场,然后是后卫,然后是守门员。显然,如果我这样做:
SELECT *
FROM 'Player'
ORDER BY position
防御者将首先返回....
SELECT *
FROM Player
ORDER BY find_in_set(position,'forward,midfielder,defender,goalkeeper')
任何一个-
FIELD()
按照@Bohemian 的建议使用,但请注意,这不适用于较大的表(因为必须对每条记录的计算函数结果执行文件排序)。
做position
一个ENUM
:
ALTER TABLE Player
MODIFY position ENUM('forward','midfielder','defender','goalkeeper');
然后您现有查询的结果将相应地排序:
SELECT * FROM Player ORDER BY position;
这是因为,如The ENUM
Type下所述:
排序
ENUM
值根据它们的索引号进行排序,这取决于枚举成员在列规范中列出的顺序。
制作一个表格来保存位置排序:
CREATE TABLE position_order (
position VARCHAR(15) PRIMARY KEY,
priority TINYINT UNSIGNED
);
INSERT INTO position_order
(position, priority)
VALUES
('forward' , 1),
('midfielder', 2),
('defender' , 3),
('goalkeeper', 4)
;
ALTER TABLE Player
ADD FOREIGN KEY (position) REFERENCES position_order (position);
然后可以通过加入表并对新priority
列进行排序来对查询结果进行排序:
SELECT * FROM Player JOIN position_order USING (position) ORDER BY priority;
请注意,在决定采用哪种方法之前,您可能希望阅读 Chris Komlenic 的文章8 为什么 MySQL 的 ENUM 数据类型是邪恶的原因。
使用FIELD()
:
SELECT *
FROM Player
ORDER BY FIELD(position,'forward', 'midfielder', 'defender', 'goalkeeper')
您可以在 ORDER BY 子句中使用 CASE 语句。
SELECT *
FROM Player
ORDER BY CASE Position WHEN "forward" THEN 1
WHEN "defender" THEN 2
WHEN "midfielder" THEN 3
WHEN "goalkeeper" THEN 4 END ASC