120

次のクエリで返されたアイテムを、IN() 関数に入力された順序で並べ替えたいと考えています。

入力:

SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C');

出力:

|   id   |   name  |
^--------^---------^
|   5    |   B     |
|   6    |   B     |
|   1    |   D     |
|   15   |   E     |
|   17   |   E     |
|   9    |   C     |
|   18   |   C     |

何か案は?

4

6 に答える 6

253
SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')

FIELD関数は、残りの文字列リスト内の最初の文字列の位置を返します。

ただし、並べ替え順序を表すインデックス付きの列を用意し、この列で並べ替えると、パフォーマンスが大幅に向上します。

于 2009-06-06T00:16:15.977 に答える
30

ここからの別のオプション:http: //dev.mysql.com/doc/refman/5.0/en/sorting-rows.html

select * 
from tablename 
order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;

したがって、あなたの場合(未テスト)は

SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY name = 'B', name = 'A', name = 'D', name =  'E', name = 'C';

あなたがしていることに応じて、私はそれが少し風変わりであることに気づきましたが、それを少し遊んだ後はいつもそれを動作させました。

于 2009-06-06T01:54:19.507 に答える
4

次のようなものを試してください

... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...
于 2009-06-06T00:13:56.653 に答える
2

テーブルには、並べ替え順序を指定する別の列 (数値) が必要です。IN 句はこのようには機能しません。

B - 1
A - 2
D - 3
E - 4
C - 5
于 2009-06-06T00:11:19.387 に答える