プレイヤーズテーブルがあります。各プレーヤーには、ゴールキーパー、ディフェンダー、ミッドフィールダー、フォワードのいずれかのポジションがあります。フォワード、ミッドフィールダー、ディフェンダー、ゴールキーパーの順で、すべての選手を復帰させたいと考えています。明らかに、もしそうなら:
SELECT *
FROM 'Player'
ORDER BY position
ディフェンダーが最初に返されます....
プレイヤーズテーブルがあります。各プレーヤーには、ゴールキーパー、ディフェンダー、ミッドフィールダー、フォワードのいずれかのポジションがあります。フォワード、ミッドフィールダー、ディフェンダー、ゴールキーパーの順で、すべての選手を復帰させたいと考えています。明らかに、もしそうなら:
SELECT *
FROM 'Player'
ORDER BY position
ディフェンダーが最初に返されます....
FIND_IN_SET()を使用する
SELECT *
FROM Player
ORDER BY find_in_set(position,'forward,midfielder,defender,goalkeeper')
また-
@Bohemian で提案されFIELD()
ているように使用しますが、これは大きなテーブルではうまくスケーリングされないことに注意してください (各レコードの計算された関数の結果に対してファイルソートを実行する必要があるため)。
作る: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 Reasons Why MySQL's ENUM Data Type Is Evilを読みたい場合があることに注意してください。
使用FIELD()
:
SELECT *
FROM Player
ORDER BY FIELD(position,'forward', 'midfielder', 'defender', 'goalkeeper')