문서 테이블이 있습니다(간단한 버전은 다음과 같습니다):
| 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)。然后,我们过滤连接的结果,只显示右侧为NULL1단계를 수행할 때 실제로 가장 큰 값을 갖는 행은 오른쪽에
결국 다음과 같이 됩니다:으아악
결론
두 가지 방법 모두 정확히 동일한 결과를 제공합니다.
에group-identifier中有两行具有max-value-in-groupmax-value-in-group이 있는 두 개의 행이 있는 경우 이 두 행은 두 방법 모두의 결과에 나타납니다.
두 방법 모두 SQL ANSI와 호환되므로 선호하는 RDBMS의 "방향"에 관계없이 사용할 수 있습니다.두 방법 모두 성능 친화적이지만 실제 상황은 다를 수 있습니다(RDBMS, 데이터베이스 구조, 인덱스 등). 따라서 방법을 선택할 때 벤치마킹
을 수행하세요. 자신에게 가장 적합한 방법을 선택하십시오. 🎜