MYSQL order by 한글 영문 숫자 특수문자 조합 정렬
본문
아래의 값처럼 데이터가 들어 있고. 아래처럼 데이터를 정렬해야 합니다. ㅠ
(a.work_uid 라는 필드에 아래와 같은 값들이 들어 있습니다.)
========================
1-1
1-20
1-112
.
.
a-1
a-30
a-105
.
.
a1-1
a1-22
a1-210
.
.
k1-2
k1-2(1)
k1-2(2)
k2-1
K2-3
k2-3(1)
k2-3(2).
.
k4-37
k4-39
k4-40
k4-352
k4-374
.
.
광주전남-8
박-8
========================
위 처럼
숫자 1순위 ,
영문 2순위(대소문자 상관없이 알파벳 순으로)
한글 3순위입니다.
현재 order by 부분의 내용은 아래와 같습니다.
ORDER BY
( CASE
WHEN ascii(SUBSTRING(a.work_uid, 1, 1)) < 58 THEN 1
WHEN ASCII(SUBSTRING(a.work_uid, 1, 1)) >= 65 AND ASCII(SUBSTRING(a.work_uid, 1, 1)) <= 119 THEN 2
WHEN ASCII(SUBSTRING(a.work_uid, 1, 1)) >= 176 AND ASCII(SUBSTRING(a.work_uid, 1, 1)) <= 200 THEN 3
ELSE 4 END ), a.work_uid
위의 쿼리로 하면 숫자 1순위, 영문2순위, 한글 3순위로 정렬되어지나 숫자는 아래처럼 정렬이 됩니다.
1-1
1-13
1-2
11-1
11-11
11-2
2-1
2-15
2-2
숫자도 아래처럼 정렬이 되도록 할 수 있는 방법이 있을까요?
1-1
1-2
1-13
2-1
2-2
2-15
11-1
11-2
11-11
답변 3
select *, if(ascii(SUBSTRING(work_uid, 1, 1)) < 58,100+substring_index(work_uid, '-', 1),substring_index(work_uid, '-', 1) ) as s1, 100+substring_index(work_uid, '-', -1) as s2 from Table order by s1, s2,work_uid
정답은 아닌듯하나 위 작성하신 쿼리문 맨 뒤에
a.work_uid * 1
이거 추가해서 해보세용
혼자 테스트로 db 만들어 넣고 쿼리문 날려서 나온값임.
등록 출력
근데 저걸 굳이 쿼리문에서 order by로 해야 하는 이유가 있을가요?
그냥 쿼리문 날려서 데이터 모아서 그 데이터를 정렬 하는게 빠를듯한데요..
그냥 데이터 while()문으로 돌려 배열로 필드명 담았다 가정하고
배열필드명 담을때 저 위에 코드값을 구분자가 필수로 다들어가는듯하니?
explode("-") 로 잘라서 별도로 담은다음에 배열을 재정렬 해주면 될듯한데용
$ArraData = array("k4-593","k4-621","k4-187","k4-561","k4-332","k4-371","k4-237","k2-54 ","k4-363","k4-493","k4-359","k4-4 ","k4-594","k4-198","k4-368","k4-292","k4-236","c6-61 ","H-241 ","k5-114","k5-115","k5-118","k4-583","k4-584","k4-585","1-1 ","1-2 ","1-13 ","2-1 ","2-2 ","2-15 ","11-1 ","11-2 ","11-11","광주전남-8","박-8","나-2");
$tmpDat = [];
foreach($ArraData as $key => $value){
$codeVal = explode("-", $value);
$tmpDat[$key]['code1'] = $codeVal[0];
$tmpDat[$key]['code2'] = (int)$codeVal[1];
$tmpDat[$key]['idx'] = $key;
$tmpDat[$key]['subject'] = $key." 제목제목";
}
while문 통해 배열담은 데이터다 생각할라고 tmpDat 에 담음;;
코드만 불러와 정렬
$code1 = array_column($tmpDat, 'code1');
$code2 = array_column($tmpDat, 'code2');
array_multisort($code1, SORT_ASC, $code2, SORT_ASC, $tmpDat);
재정렬된 배열 새로운거에 담아서 결과처리
$reNewArr = [];
foreach($tmpDat as $key => $val){
$val['work_uid'] = $val['code1']."-".$val['code2'];
unset($val['code1']);
unset($val['code2']);
$reNewArr[$key] = $val;
}
print_r($reNewArr);
결과
Array
(
[0] => Array
(
[idx] => 25
[subject] => 25 제목제목
[work_uid] => 1-1
)
[1] => Array
(
[idx] => 26
[subject] => 26 제목제목
[work_uid] => 1-2
)
[2] => Array
(
[idx] => 27
[subject] => 27 제목제목
[work_uid] => 1-13
)
[3] => Array
(
[idx] => 28
[subject] => 28 제목제목
[work_uid] => 2-1
)
[4] => Array
(
[idx] => 29
[subject] => 29 제목제목
[work_uid] => 2-2
)
[5] => Array
(
[idx] => 30
[subject] => 30 제목제목
[work_uid] => 2-15
)
[6] => Array
(
[idx] => 31
[subject] => 31 제목제목
[work_uid] => 11-1
)
........
)
이런식으로 해도 되지 않을가 생각해봅니다 원하시는 답변이면 좋을듯한데요~ ^^;
!-->!-->