mySQ에서 커스텀 ORDER BY 오더를 정의하는 방법l
MySQL에서 사용자 정의 정렬 순서를 정의하려면 어떻게 해야 합니까?
이 표를 참고하여 원하는 내용을 설명하려면:
ID Language Text
0 ENU a
0 JPN b
0 DAN c
1 ENU d
1 JPN e
1 DAN f
2 etc...
여기서 언어 = ENU가 먼저이고 마지막으로 일본어와 DAN이 오름차순이 되도록 언어 및 오름차순 ID별로 정렬된 모든 행을 반환합니다.
결과는 a, d, b, e, c, f 등입니다.
이게 가능하기나 해?
MySQL은 이러한 작업에 매우 적합한 편리한 기능을 가지고 있습니다.
ORDER BY FIELD(Language,'ENU','JPN','DAN'), ID
다만, 주의해 주세요.
다른 DBMS에는 이러한 기능이 없을 수 있기 때문에 SQL의 이식성이 떨어집니다.
언어 목록(또는 정렬 기준 값)이 길어지면 해당 언어 목록(또는 정렬 기준)에 대해 정렬 열과 함께 별도의 테이블을 만들어 쿼리에 참여시키는 것이 좋습니다.
이러한 값이 3개뿐인 경우 식을 사용할 수 있습니다.
ORDER BY `ID`,
CASE `Language`
WHEN 'ENU' THEN 1
WHEN 'JPN' THEN 2
WHEN 'DAN' THEN 3
END
(다른 값이 있을 수 있는 경우 순서를 일관되게 유지하기 위해 로직을 추가할 수 있습니다.예를 들어 다음과 같이 입력합니다.ELSE 4
거기에 대해서CASE
expression, 그 다음 순서Language
그 자체가 세 번째 순서 기준입니다.
ORDER BY `ID`,
CASE `Language`
WHEN 'ENU' THEN 1
WHEN 'JPN' THEN 2
WHEN 'DAN' THEN 3
ELSE 4
END,
`Language`
)
즉석에서 몇 가지 옵션이 있습니다.첫 번째 옵션은 언어를 ENUM으로 변경하는 것입니다(이것이 가능하다고 가정하고, 몇 가지 변형만 예상합니다).
다음과 같이 지정하면ENUM('ENU','JPN','DAN')
그리고나서ORDER Language ASC
지정한 순서대로 순서를 지정합니다.
두 번째는 어디선가 사건이 있을 겁니다
SELECT * FROM table
ORDER BY CASE Language
WHEN 'ENU' THEN 3
WHEN 'JPN' THEN 2
WHEN 'DAN' THEN 1
ELSE 0
END DESC, ID ASC
성능 측면에서 ENUM 메서드는 더 빠른 결과를 반환하지만 더 많은 언어를 추가해야 하는 경우 더 번거롭습니다.세 번째 옵션은 언어 정규화 표를 추가하는 것입니다만, 이 경우는 과잉이 될 가능성이 있습니다.
Yii2 프레임워크는 다음과 같은 방법으로 달성할 수 있습니다.
Project::find()
->orderBy([
new Expression('FIELD(pid_is_t_m,2,0,1)'),
'task_last_work'=> SORT_ASC
])->all();
언급URL : https://stackoverflow.com/questions/9378613/how-to-define-a-custom-order-by-order-in-mysql
'programing' 카테고리의 다른 글
C++의 화살표(->) 연산자의 공식 이름은 무엇입니까? (0) | 2022.10.25 |
---|---|
링크가 없는 JavaScript BLOB 파일 이름 (0) | 2022.10.25 |
'localhost'의 MySQL 서버에 연결할 수 없습니다(10061) (0) | 2022.10.25 |
Vuetify를 기반으로 나만의 컴포넌트 라이브러리를 작성하는 방법 (0) | 2022.10.25 |
Object.assign이 올바르게 복사되지 않습니다. (0) | 2022.10.15 |