programing

MySQL 결과 주문

randomtip 2022. 10. 23. 11:54
반응형

MySQL 결과 주문

MySQL/MariaDB를 사용하고 있습니다.사용처에 대한 문의가 있습니다.ORDER BY user_id ASC다음과 같은 결과를 얻을 수 있습니다.

+---------+
| user_id |
+---------+
| admin1  |
| admin10 |
| admin11 |
| admin2  |
| user1   |
| user10  |
| user11  |
| user12  |
| user13  |
| user2   |
| user20  |
| user21  |
| user22  |
| user23  |
+---------+

나는 제안된 해결책을 시도했다.ORDER BY LENGTH(user_id), user_id ASC그것은 모든 사람들만큼 효과가 있다.user_id님의 첫머리는user하지만 만약 내가user_id는, 「」라고 합시다.admin그럼 이렇게 되겠네요

+---------+
| user_id |
+---------+
| user1   |
| user2   |
| admin1  |
| admin2  |
| user10  |
| user11  |
| user12  |
| user13  |
| user20  |
| user21  |
| user22  |
| user23  |
| admin10 |
| admin11 |
+---------+

하지만 결과는 다음과 같이 주문했으면 합니다.

+---------+
| user_id |
+---------+
| admin1  |
| admin2  |
| admin10 |
| admin11 |
| user1   |
| user2   |
| user10  |
| user11  |
| user12  |
| user13  |
| user20  |
| user21  |
| user22  |
| user23  |
+---------+

SQL을 사용하여 이 작업을 수행할 수 있습니까?

를 사용합니다.LENGTH열뿐만 아니라 함수도 사용할 수 있습니다.

SELECT *
FROM yourtable
ORDER BY LENGTH(user_id), user_id ASC

산출량

user_id
user1
user2
user10
user11
user12
user13
user20
user21
user22
user23

SQL Fider: http://sqlfiddle.com/ #!9/23f4de/3/0

ID는 항상 REGEXP '^[[:alpha:]]+[[:digit:]]+$만약 그렇다면,REGEXP_REPLACE알파벳 부분을 기준으로 정렬할 숫자를 제거한 다음 문자를 제거하고 0을 추가하여 숫자 부분을 정렬합니다.예를 들어 다음과 같습니다.

ORDER BY REGEXP_REPLACE(user_id, '[[:digit:]]+$', ''),
         REGEXP_REPLACE(user_id, '^[[:alpha:]]+', '') + 0

또 다른 아이디어:

ORDER BY REGEXP_REPLACE(user_id,
              '([[:digit:]]+)',
              RIGHT(CONCAT('0000000', '\\1'), 8))

원칙은 문자열 비교가 "올바르게" 작동하도록 숫자 부분에 선행 0을 충분히 배치하는 것입니다.

주의: MySQL에서 사용할 수 없는 MariaDB 기능을 사용합니다.

언급URL : https://stackoverflow.com/questions/45345401/order-mysql-result

반응형