sql 질문드립니다.

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!
sql 질문드립니다.

QA

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;
 

답변감사합니다^^

(PHP7.4, mariadb-10.0.x) 입니다.

이상하게 CAST나 CONVERT를 적용하면 결과값 자체가 나오질 않아서요..
db값 불러오는게 아니라 카운팅을 한 숫자라서 그런건지..

알려주신대로 해도 결과값이 출력이 안됩니다. ㅠ

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;

 

위에 코드를 참고 해서 적용해보시길 바랍니다.

다음과 같이 해 볼 수 있을 것 같습니다. 

 

문제는 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"과 같이 됩니다.

답변을 작성하시기 전에 로그인 해주세요.
전체 15,435
QA 내용 검색
filter #php ×

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT