sql 질문드립니다.
본문
안녕하세요
wr_5 와 같은 값을 그룹으로 묶어
카운팅을 하려 합니다.
case 'wr_5_count':
$sql = "SELECT wr_5, COUNT(*) AS wr_5_count FROM $write_table WHERE wr_5 IS NOT NULL AND wr_5 <> '' GROUP BY wr_5";
$sql .= " ORDER BY wr_5_count {$sort_order}";
break;
잘되는데 정렬을 할때
1, 10, 11, 2, 3, 4 이렇게 되어서...
문자열로 되나싶어서
어차피 숫자만 들어가니까
CAST나 CONVERT를 적용해봐도 그대로더라구요
DB에 저장된값이 아닌 카운팅값이라 그런가.. 이유를 모르겠습니다.
고수님들의 조언 부탁드립니다. ㅠ
!-->
답변 5
혹시 MYSQL 버전이 어떻게 되시나요?
아래의 코드를 한번 참고해 보세요~
case 'wr_5_count':
$sql = "SELECT wr_5, COUNT(*) AS wr_5_count FROM $write_table WHERE wr_5 IS NOT NULL AND wr_5 <> '' GROUP BY wr_5";
$sql .= " ORDER BY CAST(wr_5_count AS UNSIGNED) {$sort_order}";
break;
SELECT 를 불러와서 위에서 다시한번 감싸면 될꺼 같습니다.
case 'wr_5_count':
$sql = "SELECT wr_5, wr_5_count FROM (
$sql .= "SELECT wr_5, COUNT(*) AS wr_5_count FROM $write_table WHERE wr_5 IS NOT NULL AND wr_5 <> '' GROUP BY wr_5 ";
$sql .= " ) AS aa
$sql .= " ORDER BY wr_5_count {$sort_order} ";
break;
위에 코드를 참고 해서 적용해보시길 바랍니다.
!-->order by wr_5_count * 1 해보시면?
다음과 같이 해 볼 수 있을 것 같습니다.
문제는 wr_5 컬럼이 숫자로 인식되지 않고 문자열로 인식되어 오름차순으로 정렬될 때 숫자의 앞머리가 기준이 되기 때문입니다. 따라서 "1", "10", "11", "2", "3", "4"와 같이 정렬되는 것이 맞습니다.
case 'wr_5_count':
$sql = "SELECT wr_5, COUNT(*) AS wr_5_count FROM $write_table WHERE wr_5 IS NOT NULL AND wr_5 <> '' GROUP BY wr_5";
$sql .= " ORDER BY CAST(wr_5 AS SIGNED) {$sort_order}, wr_5 {$sort_order}";
break;
CAST(wr_5 AS SIGNED)를 사용하여 wr_5 값을 숫자로 변환하고, 숫자로 변환한 값으로 정렬하게 됩니다.
결과는 "1", "2", "3", "4", "10", "11"과 같이 됩니다.
!-->$sql .= " ORDER BY wr_5_count {$sort_order}";
->
$sql .= " ORDER BY 2";