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

また-

  • @Bohemian で提案されFIELD()ているように使用しますが、これは大きなテーブルではうまくスケーリングされないことに注意してください (各レコードの計算された関数の結果に対してファイルソートを実行する必要があるため)。

  • 作る: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 Reasons Why MySQL's ENUM Data Type Is Evilを読みたい場合があることに注意してください。

于 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 に答える