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 2009

DB 전환 후 오라클의 "디코딩"기능을 대체합니다.
Martin Lyne

7
꼼꼼한. 알 수없는 속성 값 (목록에 없음)은 알려진 값보다 우선합니다. 즉 FIELD(letter, 'A', 'C'), 목록은 먼저 B 문자가있는 항목을 먼저 반환합니다 ( A | B | C값 이있는 레코드 집합 가정 ). 이를 방지하려면 목록을 반전하고 DESC, 즉 FIELD(letter, 'C', 'A') DESC.
Gajus 2017 년

SQL 서버에서 이것을 어떻게 달성합니까?
user123456

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 () 함수를 제안 된 다른 답변으로 사용하는 것보다 낫지 만이 방법을 사용하여 색인을 사용할 기회가 있습니다 (하지만 색인을 얼마나 잘 사용할 수 있는지는 확실하지 않습니다)
ʞɔıu 2009-06-06


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;

설명 : 계정 목록을 표시하고 싶습니다. 여기 sp에서 고객 ID를 전달하고 있습니다. 이제 해당 고객과 연결된 계정이있는 계정 이름이 맨 위에 표시되고 다른 계정이 알파벳순으로 표시됩니다.


2

정렬 순서를 지정하는 테이블에 다른 열 (숫자)이 필요합니다. IN 절은 이런 식으로 작동하지 않습니다.

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

2
원하는 순서는 쿼리 단위 일 수 있습니다.
Vladimir Dyuzhev 2009

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.