2009-06-06 4 views
76

次のクエリで返される項目をで並べ替えると、IN()関数に入力された順序で並べ替えることになります。IN()内のMySQL - ORDER BYの値

INPUT:

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

OUTPUT:

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

任意のアイデア?

答えて

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

FIELD関数は、文字列の残りのリストの最初の文字列の位置を返すようなものを試してみてください。

ただし、ソート順を表す索引列を作成し、この列でソートする方がパフォーマンスが向上します。ここから

+0

ええ、それはかなりクールです! MySQL固有のものだと思われますか? –

+9

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

+0

DB交換後のOracleの「デコード」機能に代わる素晴らしい機能です。 –

2

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

B - 1 
A - 2 
D - 3 
E - 4 
C - 5 
+1

所望の順序ごとのクエリであってもよいです。 –

4

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

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

だろうが、常にちょっと遊んだ後に動くようになった。

+0

これは、field()を使用するとインデックスの使用が妨げられるが、このメソッドを使用してインデックスを使用する可能性があるため、フィールド()関数を使用するよりも良い可能性があります。 ) –

+0

これはMySQL 5.6では動作しません:http://sqlfiddle.com/#!9/9bd6c5/3。 – Lacek

+1

@Lacekそれはhttp://sqlfiddle.com/#!9/9bd6c5/5 – trrrrrrm

3

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

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; 

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

0

だけ

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

ような状況を回避

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

を使用順不同結果の行で終了します:1と11、交代