Peach's CODE peach

공부한 내용을 정리중입니다. 틀린 내용이 있을 수 있습니다 : )

코딩하는 딱복

[MySQL] 문자열에서 max() 본문

Error ⚠️

[MySQL] 문자열에서 max()

yundi 2024. 1. 4. 10:38

⚠️ max() 값을 제대로 가져오지 못하는 경우

DB연동 후 공부를 하던 도중에 영어 점수가 가장 높은 레코드를 반환하려고 max() 함수를 사용했는데, 실제 가장 큰 값인 100이 아니라 90이 자꾸 출력되는 에러가 있었다.

max() 함수는 해당 컬럼의 레코드들 중에서 크기가 가장 큰 행을 출력하는 함수이다. 이 말은 즉, 데이터 타입이 숫자 타입 같은 곳에서 사용한다는 뜻이다.

 

우선 아래는 max()함수를 사용했을 때 출력되는 값이다.

    $sql = "SELECT * FROM lyj_schoolRecord WHERE english = (SELECT max(english) FROM lyj_schoolRecord)";
    $res = $connect_db->query($sql);
    $dataCnt = $res->num_rows;

    for($i = 0; $i < $dataCnt; $i++){
        $memberInfo = $res->fetch_array(MYSQLI_ASSOC);
        echo "학생번호 : ".$memberInfo['myMemberID'];
        echo "<br>";
        echo "클래스 : ".$memberInfo['class'];
        echo "<br>";
        echo "영어 : ".$memberInfo['english'];
        echo "<hr>";
    }

학생번호 : 1
클래스 : 1
영어 : 90

학생번호 : 4
클래스 : 2
영어 : 90

실제로 테이블에 저장된 값에는 영어 점수가 100점인 학생이 있는데 90점인 학생을 출력하였다.

 

테이블 구조를 보면 점수가 숫자타입이 아닌 tinytext, 즉 문자타입으로 지정되어있는 것을 볼 수 있다.

문자열을 비교하기 때문에 max 값을 가져오는 데 문제가 발생한 것이다.

 

해결방안

인터넷에서 찾아보니 cast() 함수도 많이 사용하는 것 같았다. 나는 SELECT 절 컬럼에 +0 을 더해줘서 문자열을 숫자로 인식하도록 해주었다.

$sql = "SELECT * FROM lyj_schoolRecord WHERE english = (SELECT max(english+0) FROM lyj_schoolRecord)";

학생번호 : 3
클래스 : 2
영어 : 100

'Error ⚠️' 카테고리의 다른 글

[Nuxt.js] useFetch와 $fetch  (0) 2024.06.24
[PHP] 글자 깨짐 해결  (2) 2024.01.03