developer tip

MySQL-IN () 내의 ORDER BY 값

optionbox 2020. 8. 20. 08:12
반응형

MySQL-IN () 내의 ORDER BY 값


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';

당신이 무엇을하는지에 따라 나는 그것이 약간 기발하다는 것을 알았지 만 항상 조금 가지고 놀면 작동합니다.


다음과 같은 시도

... 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

그냥 사용

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

같은 상황을 피하십시오

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

순서가 지정되지 않은 결과 행으로 끝납니다 : 1 및 11 교대

참고 URL : https://stackoverflow.com/questions/958627/mysql-order-by-values-within-in

반응형