2012-03-05 13 views
-1

フィールドを並べ替えるために必要なSQLクエリがあります。通常、クエリは次のようになります。SQL - 乱数順のフィールドによる並べ替え

select * from model.field1、model.field2 問題は、最初の並べ替えが非常に特定の順序で行われる必要があるということです。

ここで、フィールド1の順序は、特定の順序でフィルタリングする必要があります。

たとえば、アルファベット順に車をリストする代わりに、私は例えば レクサス、フォード、トヨタ、マツダ、メルセデスなどで並べ替えることを好むだろうこれを行うにはクリーンな方法はありますか?現在、私は結果を得て、それを特定のリストに入れなければならず、それほどきれいではありません。私はデータベース内のものを変更するオプションがありません

ありがとうございました。

+1

ところで、あなたは本当にランダムな順序について話しているわけではありません。より多くの所定の命令。 –

答えて

1

CASE文を使用してカスタムORDER BYを作成できます。
CASE文は条件をチェックし、その条件を満たす行に、条件を満たす行に割り当てられた値よりも低い値を割り当てます。
それはおそらく例与えられた理解するのが最も簡単です:

SELECT mycolumn 
    FROM model 
ORDER BY CASE WHEN model.field1 = 'Lexus' THEN 0 
       WHEN model.field1 = 'Ford'  THEN 1 
       WHEN model.field1 = 'Toyota' THEN 2 
       WHEN model.field1 = 'Mazda' THEN 3 
       WHEN model.field1 = 'Mercedes' THEN 4 END, model.field2; 
1
order by (case 
when field1 = 'Lexus' then 1 
when field1 = 'Ford' then 2 
when field1 = 'Toyota' then 3 
... 
else null end) 
0

あなたはとても似BY句の窓関数とPARTITIONを使用する必要があります。

SELECT ROW_NUMBER() OVER(PARTITION BY manufacturer ORDER BY field1) [RN], 
     manufacturer, 
     field1, 
     field2 

FROM model 

これは、それぞれの行番号を与えますこの例のfield1の順序に基づいて、partition by句内の異なるグループ化。

EDIT:

あなたRDMSは、ウィンドウ関数をサポートしていない場合は、メーカーによって、その後第2の値を注文することができます - この場合と「グループ」一緒に各メーカーのすべての行:

SELECT manufacturer, field1 

FROM model 

ORDER BY manufacturer, field1 
+0

これは他のいくつかのRDBMSで動作しますが、MySQLがウィンドウ機能をサポートしているとは思いません。 – bernie

+0

その場合、私の答えは無視してください。私はmySQLで作業しませんでしたが、ウィンドウ関数は標準的なベンダーの汎用SQL実装であるという印象を受けました: http://en.wikipedia.org/wiki/SQL:2003 –

関連する問題