MySQL-IN()内のORDER BY値


107

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     |

何か案は?

回答:


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

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

ただし、並べ替え順序を表すインデックス付きの列を作成してから、この列で並べ替えることをお勧めします。


9
@Vladimir-はい、MySQL固有です。質問にはmysqlタグがあります。
Ayman Hourieh

DB切り替え後のOracleの「デコード」機能に代わるものです。
Martin Lyne

7
注意してください。不明なプロパティ値(リストにない)は既知の値よりも優先されます。つまりFIELD(letter, 'A', 'C')、リストは最初にB文字のエントリを最初に返します(A | B | C値のあるレコードのセットを想定しています)。これを回避するには、リストを逆にしてDESC、つまりを使用しますFIELD(letter, 'C', 'A') DESC
Gajus 2017年

SQLサーバーでこれを実現するにはどうすればよいですか。
user123456 2019年

29

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

あなたが何をしているのかに応じて、私はそれを少し風変わりだと思いましたが、それを少し遊んだ後はいつもうまくいきました。


これは、field()関数を使用するよりも良いかもしれません。field()を使用すると、インデックスの使用が妨げられるためです。ただし、このメソッドを使用してインデックスを使用する可能性があります(ただし、インデックスをどの程度うまく使用できるかわかりません)。
2009


3

これは誰かを助けることができるかもしれません(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を渡しています。これで、顧客がリンクされているアカウント名が一番上に表示され、その後に他のアカウントがアルファベット順に表示されます。



0

ただ使う

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

のような状況を避けます

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.