2011-07-05 26 views
1

次のような質問があります。ORDER BY FIELD()とデータの重複

SELECT stringdata FROM table ORDER BY FIELDS(stringdata, 'tg','nk','mg','pl') asc; 

何らかの理由で、結果が最下部に表示されます。結果の最後の行ではなく行1に「tg」から始まる結果を入れるためにクエリを取得するにはどうすればよいですか?

それだけでなく、データ内の1つの「TG」より多くのがあります、私はそれが、この予想される出力でそれを並べ替えしたいと思います:

stringdata 
__________ 
    'tg' 
    'tg' 
    'tg' 
    'nk' 
    'nk' 
    'mg' 
    'mg' 
    'mg' 
    'pl' 

これまでORDER BY Fields()を使用するだけの1つのインスタンスをソートしていますすべてではなくデータです。

ascの代わりにdescを使用すると、クエリが正常に動作します。私はその後、最初の行に'pl'を取得し、'nk'は、など

答えて

2

は通常ORDER BYFIELD句は

SELECT * FROM table ORDER BY FIELD(field, high_priority, second_high, 
       ,....., low_priority); 
あなたが述べたように、ソートが行われたクエリでそう

としたときのようなものを'mg'作品最も低い優先順位から印刷されたASCを与えました。あなたが一番上にtgをしたいのであれば、あなたのケースのために、あなたはどちらかFIELDSにしたり、'tg'との最初の行をしたい場合は、すでにして行、その後、desc

+0

問題は、私は可能なフィールド(stringdata、「TG」、「など」)のすべてを定義しない場合はASC一番下に押し込まれます。私が定義しなかったものが最初の結果となっています。 – Tek

+0

@Tek:あなたが定義していないものは最低の優先度とみなされますので、ASCを注文するときは最初に来る傾向があります。 – Balanivash

0

使用を試してみましたとして優先順位を並べ替えることができます....その後、'pl'と、その後すべての残りの部分は、(ASCまたはDESC)がこれを使用するソート:

SELECT stringdata 
FROM table 
ORDER BY FIELD(stringdata, 'pl','mg', 'nk', 'tg') DESC 
     , stringdata ASC  --- or DESC