답변:
SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')
FIELD의 함수 스트링의 나머지 목록의 첫 번째 문자열의 위치를 반환한다.
그러나 정렬 순서를 나타내는 인덱싱 된 열을 보유한 다음이 열을 기준으로 정렬하는 것이 성능면에서 훨씬 좋습니다.
FIELD(letter, 'A', 'C')
, 목록은 먼저 B 문자가있는 항목을 먼저 반환합니다 ( A | B | C
값 이있는 레코드 집합 가정 ). 이를 방지하려면 목록을 반전하고 DESC, 즉 FIELD(letter, 'C', 'A') DESC
.
여기에서 또 다른 옵션 : 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';
당신이 무엇을하는지에 따라 나는 그것이 약간 기발하다는 것을 알았지 만 항상 조금 가지고 놀면 작동합니다.
다음과 같은 시도
... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...
누군가에게 도움이 될 수 있습니다 (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;
설명 : 계정 목록을 표시하고 싶습니다. 여기 sp에서 고객 ID를 전달하고 있습니다. 이제 해당 고객과 연결된 계정이있는 계정 이름이 맨 위에 표시되고 다른 계정이 알파벳순으로 표시됩니다.
정렬 순서를 지정하는 테이블에 다른 열 (숫자)이 필요합니다. IN 절은 이런 식으로 작동하지 않습니다.
B - 1
A - 2
D - 3
E - 4
C - 5