3

我有一张球员桌。每个球员都有一个位置,可以是守门员、后卫、中场或前锋。我想回归所有球员,首先是前锋,然后是中场,然后是后卫,然后是守门员。显然,如果我这样做:

SELECT * 
FROM  'Player' 
ORDER BY position

防御者将首先返回....

4

4 回答 4

4

使用FIND_IN_SET()

SELECT * 
FROM Player 
ORDER BY find_in_set(position,'forward,midfielder,defender,goalkeeper')
于 2013-09-20T23:06:15.857 回答
3

任何一个-

  • FIELD()按照@Bohemian 的建议使用,但请注意,这不适用于较大的表(因为必须对每条记录的计算函数结果执行文件排序)。

  • position一个ENUM

    ALTER TABLE Player
      MODIFY position ENUM('forward','midfielder','defender','goalkeeper');
    

    然后您现有查询的结果将相应地排序:

    SELECT * FROM Player ORDER BY position;
    

    这是因为,如The ENUMType下所述:

     排序

    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 数据类型是邪恶的原因。

于 2013-09-20T23:19:19.353 回答
0

使用FIELD()

SELECT * 
FROM Player 
ORDER BY FIELD(position,'forward', 'midfielder', 'defender', 'goalkeeper')
于 2013-09-20T23:09:11.787 回答
0

您可以在 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

SQL 小提琴示例

于 2013-09-20T23:22:35.853 回答