2009-08-07 11 views
20

テーブルで選択を行い、結果を特定のキーワードまたはキーワードのリストで並べ替えたいとします。SQL Order By文字列のリスト?

ID Code 
1 Health 
2 Freeze 
3 Phone 
4 Phone 
5 Health 
6 Hot 

そうではなく、ちょうど私がorder by Health, Phone, Freeze, Hotしたいのですが、簡単なOrder By asc/descを実行します。たとえば、私はそうのようなテーブルを持っていますこれは可能ですか? (コードの別のテーブルを作成します...コード表の使用をExplaing

を:

+0

なぜ電話は2回ありますか? – pjp

答えて

44

は、これを使用してみてください:

select * from table 
order by FIELD(Code, 'Health', 'Phone', 'Freeze', 'Hot') 
+3

これはドキュメント(コメントセクション)ごとの適切な解決策です。良い説明はこちら[here](http://www.electrictoolbox.com/mysql-order-specific-field-values/) – kapad

+1

FIELD()関数はMySQLに固有であり、他の関数では機能しないことに注意してくださいSQLデータベースサーバ。 – orrd

1

はいによってあなたのコード表、その後順code.CodeOrder

EDITにあなたの結果を参加しますCodeOd、Code、CodeOrder)を呼び出して、これとCodeOrderの注文に参加します。これはコードや注文を簡単に変更することができるので、(ケース...)ハックで注文するよりもうれしいです。

+0

私はポイントは、希望の順序は、コードやIDの順序ではないと思う。 – cletus

+0

私はコードのテーブルがコードIDと注文IDと共に存在すると仮定していました。 – pjp

12

キーワードテーブルに参加し、シーケンス列とORDER BY Keyword.Sequenceを含めることができます。

ID Code  Sequence 
1 Health 1 
2 Freeze 3 
3 Phone 2 
4 Hot  4 

次にあなたが参加することができます:

例キーワードテーブルは次のようになります。

SELECT * 
FROM MyTable INNER JOIN 
      Keywords ON Keywords.ID = MyTable.KeywordID 
ORDER BY Keywords.Sequence 

これはあなたのアイデアを提供します。

3

カップルオプション:

  1. を数値 所望の順序

  2. でOrderCode列を追加し、このテーブルにFKでテーブルを追加ID とOrderCode

10

は、ここで恐ろしいハックです:

select * from table 
order by (
    case Code 
    when 'Health' then 0 
    when 'Phone' then 1 
    when 'Freeze' then 2 
    when 'Hot' then 3 
    end 
) 
+7

私は "恐ろしいハック"部分に同意します;-) –

+1

私も同意します:)そして静的リストでしか動作しません。将来、ある時点で別のコードが追加された場合、ストアプロシージャは次のようにリファクタリングする必要があります。まあ、この変更に対応する。 –

+0

はい、それは私がしたいと思っているように尊敬していないと維持するお尻になるが、これは私がしなければならないことです。私はすでに – Tikeb

3

ORDER BYか、頻繁にやりたいと思っているものと、ここで指定した以上の価値があるものですか?

あなたが与えられたことを順序は任意であり、そのための識別子は、(私はMySQLのが、精通していないよあなたが

SELECT 
    ID, 
    Code, 
    CASE Code 
     WHEN 'Health' THEN 1 
     WHEN 'Phone' THEN 2 
     WHEN 'Freeze' THEN 3 
     WHEN 'Hot' THEN 4 
    END As OrderBy 
FROM Table 
ORDER BY 
    OrderBy 

それとも

​​

望むものを達成するために与えられる必要があります上記はSQL Serverで動作しますが、MySQLの構文もあまり変わりません)

これを頻繁にやりたければテーブルにOrderBy列を作成するか、このテーブルへのFKリンクを持つOrderByテーブルを作成し、その中にOrderBy数値フィールドを指定します。

2

こんにちは、これはSQL Serverのクエリですが、私はあなたが同様のMySQLでこれを行うことができます確信している:

SELECT ID, Code 
FROM x 
ORDER BY 
    CASE Code WHEN 'Health' THEN 1 
       WHEN 'Phone' THEN 2 
       WHEN 'Freeze' THEN 4 
       WHEN 'Hot' THEN 5 
    ELSE 6 END ASC 
    , Code ASC 
4

今日では、MySQLがfind_in_set()

と呼ばれる機能を持っています

このように使用します。

select * from table 
order by find_in_set(Code,'Health','Phone','Freeze','Hot')