P粉5187995572023-08-21 13:24:03
올바른 해결책은 다음과 같습니다:
으아악 o
中的每一行与具有相同Group
列值和较大Age
列值的b
中的所有行进行匹配。任何o
中的行如果在Age
列中没有其组中的最大值,则会与b
에서 하나 이상의 줄과 일치합니다.
LEFT JOIN
使其将组中的最年长的人(包括那些独自一人的人)与来自b
的一行NULL
짝을 맞춰보세요('그룹에 나이 많은 사람 없음').
INNER JOIN
을 사용하면 이 줄이 일치하지 않게 되어 무시됩니다.
WHERE
子句仅保留从b
中提取的字段中具有NULL
알았어. 그들은 각 그룹에서 가장 연장자입니다.
이 솔루션과 기타 솔루션은 SQL 안티패턴 볼륨 1: 데이터베이스 프로그래밍의 함정 방지 책에 자세히 설명되어 있습니다.
P粉7416783852023-08-21 12:41:11
mysql에서 이 작업을 수행하는 매우 쉬운 방법이 있습니다:
으아악이 방법은 mysql에서는 그룹별로 열이 아닌 집계를 할 수 없기 때문에 가능합니다. 이 경우 mysql은 첫 번째 행만 반환합니다. 해결 방법은 먼저 원하는 순서로 데이터를 정렬한 다음 원하는 열별로 그룹화하는 것입니다.
복잡한 하위 쿼리로 max()
등을 찾는 문제를 방지하고 최대값이 동일한 여러 행이 있을 때 여러 행을 반환하는 문제도 방지합니다(다른 답변에서는 이렇게 합니다).
참고: 이것은 mysql 전용 솔루션입니다. 내가 아는 다른 모든 데이터베이스에서는 "그룹 기준 절에 나열되지 않은 집계 열이 아닙니다."라는 오류 메시지와 함께 SQL 구문 오류가 발생합니다. 이 솔루션은 문서화되지 않은 동작을 사용하므로, 보다 신중한 사람이라면 MySQL의 향후 버전에서 이 동작이 변경되는 경우에도 여전히 작동하는지 확인하는 테스트를 포함할 수 있습니다.
버전 5.7부터 sql-mode
设置默认包含ONLY_FULL_GROUP_BY
이 기능이 작동하려면 이 옵션을 사용하지 해서는 안 됩니다 (이 설정을 제거하려면 서버의 옵션 파일을 편집하세요).