source

MIN() 함수를 사용한 MySQL의 잘못된 결과

gigabyte 2022. 9. 11. 17:25
반응형

MIN() 함수를 사용한 MySQL의 잘못된 결과

질문:.

이 예에서 우리는 1교 5명의 학생들의 성적을 가지고 있습니다.우리는 어떤 학생이 가장 낮은 점수를 받았는지 알고 싶다.

우리는 학생번호 4번을 받기를 기대했지만 SQL이 학생번호 1을 반환한다.

누가 나 좀 도와줄래?잘 부탁드립니다

표 1:

CREATE TABLE `table1` (
  `school_id` int(11) unsigned NOT NULL,
  `student_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `grade` int(11) unsigned NOT NULL,
  PRIMARY KEY (`student_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

데이터:

INSERT INTO `table1` (`school_id`, `student_id`, `grade`)
VALUES
    (1, 1, 20),
    (1, 2, 15),
    (1, 3, 18),
    (1, 4, 12),
    (1, 5, 15);

SQL 쿼리:

SELECT t1.`school_id`, t1.`student_id`, MIN(t1.grade)
FROM table1 as t1
WHERE t1.`school_id`=1
GROUP BY t1.`school_id`;

인쇄 화면:

인쇄 화면

SELECT * FROM table1 ORDER BY grade LIMIT 1

각 학교에서 성적이 가장 안 좋은 학생을 원한다면 그건...

SELECT x.* 
  FROM table1 x
  JOIN 
     ( SELECT school_id
            , MIN(grade) grade 
         FROM table1
        GROUP
           BY school_id
     ) y
    ON y.school_id = x.school_id
   AND y.grade = x.grade;

http://sqlfiddle.com/ #!9/f44cb2/1

@tadman의 조언으로 해결책을 생각해냈습니다.

이 문제에 대해 알게 된 경우 아래에 기재되어 있습니다.

우리는 왜 제한을 사용해야 하는지 이해하지 못했다.한계선을 뺄 경우 잘못된 결과를 얻을 수 있습니다.

SELECT t2.`school_id`, t2.`student_id`, t2.grade
FROM 
    (
    SELECT t1.`school_id`, t1.`student_id`, t1.grade
    FROM table1 as t1
    WHERE t1.`school_id`=1
    ORDER BY t1.`grade` ASC
    limit 4294967295
    )
as t2
GROUP BY t2.`school_id`;

고객님의 문제에 대해 더 이상의 요구사항이 없는 한, 다음과 같은 방법으로 해결하실 수 있습니다.

select t1.school_id, t1.student_id, t1.grade
from table1 as t1,
(select school_id, min(grade) as grade from table1 group by school_id) as t2
where t1.school_id=t2.school_id
and t1.grade=t2.grade;

언급URL : https://stackoverflow.com/questions/37263412/mysql-wrong-result-using-min-function

반응형