Peach's CODE
공부한 내용을 정리중입니다. 틀린 내용이 있을 수 있습니다 : )
코딩하는 딱복
[MySQL] 문자열에서 max() 본문
⚠️ 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 |