문서 테이블이 있습니다(간단한 버전은 다음과 같습니다):
id | 리디렉션 | 콘텐츠 |
---|---|---|
1 | 1 | ... |
2 | 1 | ... |
1 | 2 | ... |
1 | 3 | ... |
각 ID에 대해 하나의 행을 선택하고 가장 큰 버전만 선택하는 방법은 무엇입니까?
위 데이터를 바탕으로 결과에는 [1, 3, ...]
和 [2, 1, ..]
라는 두 줄이 포함되어야 합니다. 저는 MySQL을 사용하고 있습니다.
현재 결과 세트에서 이전 버전을 감지하고 덮어쓰기 위해 while
루프에서 검사를 사용하고 있습니다. 그러나 이것이 결과를 얻는 유일한 방법입니까? SQL 솔루션은 없나요?
저는 가능한 한 적은 코드를 사용하는 것을 선호합니다...
IN
를 사용하여 달성할 수 있습니다. 이것을 시도해 보세요:제 생각에는 이것이 더 간단하고... 읽고 유지하기가 더 쉽습니다.
첫눈에...
GROUP BY
子句中使用MAX
집계 함수만 있으면 됩니다:일이 그렇게 간단할 수가 없잖아요?
열
content
개도 필요하다는 사실을 방금 확인했습니다.SQL에서 이는 매우 일반적인 문제입니다. 특정 그룹 식별자를 기반으로 특정 열에서 최대값을 갖는 전체 데이터 행을 찾습니다. 나는 직장생활을 하면서 이런 질문을 많이 들어왔습니다. 사실 이 질문은 제가 현 직무에 대한 기술면접에서 답변한 질문입니다.
이 질문은 실제로 너무 일반적이기 때문에 Stack Overflow 커뮤니티에서는 이러한 유형의 질문을 처리하기 위해 특별히 태그를 만들었습니다: greatest-n-per-group.
기본적으로 이 문제를 해결하는 방법에는 두 가지가 있습니다.
간단한
를 사용하여 참여group-identifier, max-value-in-group
하위 쿼리이 접근 방식에서는 먼저 하위 쿼리에서
및group-identifier, max-value-in-group
(已经在上面解决了)。然后,你将你的表与子查询进行连接,使用group-identifier
和max-value-in-group
를 찾습니다(위에서 이미 해결됨). 그런 다음 동등 조인에max-value-in-group
을 사용하여 하위 쿼리로 테이블을 조인합니다.으아악
왼쪽 조인에 셀프 조인을 사용하고 조인 조건 및 필터 조건을 조정하세요group-identifier
이 접근 방식에서는 테이블 자체에 대한 왼쪽 조인을 수행합니다. Equijoin은NULL
(记住这是一个LEFT JOIN
)。然后,我们过滤连接的结果,只显示右侧为NULL
1단계를 수행할 때 실제로 가장 큰 값을 갖는 행은 오른쪽에으아악
결론group-identifier
中有两行具有max-value-in-group
max-value-in-group
이 있는 두 개의 행이 있는 경우 이 두 행은 두 방법 모두의 결과에 나타납니다.두 방법 모두 성능 친화적이지만 실제 상황은 다를 수 있습니다(RDBMS, 데이터베이스 구조, 인덱스 등). 따라서 방법을 선택할 때 벤치마킹
을 수행하세요. 자신에게 가장 적합한 방법을 선택하십시오. 🎜