次のクエリで返されるアイテムを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 |
何か案は?
SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')
[〜#〜] field [〜#〜] 関数は、残りの文字列リスト内の最初の文字列の位置を返します。
ただし、ソート順を表すインデックス列を作成し、この列でソートする方が、パフォーマンス面ではるかに優れています。
ここから別のオプション: 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';
あなたが何をしているのかにもよりますが、私はそれが少し風変わりだと感じましたが、少し遊んだ後は常に動作するようになりました。
これは誰かを助けることができるかもしれません(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を渡します。これで、アカウント名がリストされ、その顧客にリンクされたアカウントが上部に表示され、その後にアルファベット順に他のアカウントが表示されます。
のようなものを試してください
... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...
テーブルに別の列(数値)が必要です。この列でソート順を指定します。 IN句はこの方法では機能しません。
B - 1
A - 2
D - 3
E - 4
C - 5
ただ使う
order by INSTR( ',B,C,D,A,' , concat(',' , `field`, ',' ) )
のような状況を避ける
INSTR('1,2,3,11' ,`field`)
順序付けられていない結果行で終了します:1と11の交互