sql 질문드립니다. 채택완료
안녕하세요
wr_5 와 같은 값을 그룹으로 묶어
카운팅을 하려 합니다.
</p>
<p>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;</p>
<p>
잘되는데 정렬을 할때
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;
답변에 대한 댓글 1개
댓글을 작성하려면 로그인이 필요합니다.
$sql .= " ORDER BY wr_5_count {$sort_order}";
->
$sql .= " ORDER BY 2";
댓글을 작성하려면 로그인이 필요합니다.
다음과 같이 해 볼 수 있을 것 같습니다.
문제는 wr_5 컬럼이 숫자로 인식되지 않고 문자열로 인식되어 오름차순으로 정렬될 때 숫자의 앞머리가 기준이 되기 때문입니다. 따라서 "1", "10", "11", "2", "3", "4"와 같이 정렬되는 것이 맞습니다.
</p>
<p>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"과 같이 됩니다.
댓글을 작성하려면 로그인이 필요합니다.
SELECT 를 불러와서 위에서 다시한번 감싸면 될꺼 같습니다.
</p>
<p>case 'wr_5_count':</p>
<p>$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 ";</p>
<p>$sql .= " ) AS aa
$sql .= " ORDER BY wr_5_count {$sort_order} ";
break;</p>
<p>
위에 코드를 참고 해서 적용해보시길 바랍니다.
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인
(PHP7.4, mariadb-10.0.x) 입니다.
이상하게 CAST나 CONVERT를 적용하면 결과값 자체가 나오질 않아서요..
db값 불러오는게 아니라 카운팅을 한 숫자라서 그런건지..
알려주신대로 해도 결과값이 출력이 안됩니다. ㅠ