web-dev-qa-db-ja.com

MySQL-IN()内のORDER BY値

次のクエリで返されるアイテムを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     |

何か案は?

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

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

ただし、ソート順を表すインデックス列を作成し、この列でソートする方が、パフォーマンス面ではるかに優れています。

210
Ayman Hourieh

ここから別のオプション: 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';

あなたが何をしているのかにもよりますが、私はそれが少し風変わりだと感じましたが、少し遊んだ後は常に動作するようになりました。

27
joedevon

これは誰かを助けることができるかもしれません(SPでp_CustomerIdが渡されます):

SELECT CompanyAccountId, CompanyName
FROM account
LEFT JOIN customer where CompanyAccountId = customer.AccountId
GROUP BY CompanyAccountId
ORDER BY CASE WHEN CompanyAccountId IN (SELECT AccountId 
                                          FROM customer
                                          WHERE customerid= p_CustomerId) 
                 THEN 0
                 ELSE 1
          END, CompanyName;

説明:アカウントリストを表示します。ここでは、spで顧客IDを渡します。これで、アカウント名がリストされ、その顧客にリンクされたアカウントが上部に表示され、その後にアルファベット順に他のアカウントが表示されます。

3
Hun

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

... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...
3

テーブルに別の列(数値)が必要です。この列でソート順を指定します。 IN句はこの方法では機能しません。

B - 1
A - 2
D - 3
E - 4
C - 5
2
Robert Harvey

ただ使う

order by INSTR( ',B,C,D,A,' ,  concat(',' , `field`, ',' ) )

のような状況を避ける

 INSTR('1,2,3,11' ,`field`) 

順序付けられていない結果行で終了します:1と11の交互

0
PercyQQ