Docrine Query Language: 그룹당 최대 또는 최신 행 검색
DQL(Docrine Query Language)에서 그룹당 최대 또는 최신 행 검색 그룹은 하위 쿼리와 조인을 사용하여 달성할 수 있습니다.
문제 설명:
원래 SQL 문은 하위 쿼리에 대한 내부 조인을 사용하여 이름당 최대 점수를 검색하려고 시도합니다. 그러나 질문의 DQL 번역에는 "name"이라는 연결이 "Score" 엔터티에 존재하지 않음을 나타내는 구문 오류가 표시됩니다.
해결책:
제안된 솔루션은 집계 함수를 사용하지 않고 조인을 사용하여 점수가 낮은 행을 제외하는 데 중점을 둡니다. 이 접근 방식은 효율적인 쿼리를 보장하고 추가 논리 또는 계산이 필요하지 않습니다.
DQL 동등 항목:
SELECT a FROM AppBundle\Entity\Score a LEFT JOIN AppBundle\Entity\Score b WITH a.name = b.name AND a.score < b.score WHERE b.score IS NULL ORDER BY a.score DESC
설명:
왼쪽 조인 조건은 이름별로 점수가 가장 높은 행만 결과에 포함되도록 합니다. 점수가 낮은 행은 동일한 이름에 대해 더 높은 점수가 없는지 확인하는 후속 WHERE 절에 의해 필터링됩니다.
쿼리 작성기 대안:
이 접근 방식은 쿼리 작성기를 사용하여 구현할 수도 있습니다.
$repo = $DM->getRepository('AppBundle\Entity\Score'); $results = $repo->createQueryBuilder('a') ->select('a') ->leftJoin( 'AppBundle\Entity\Score', 'b', 'WITH', 'a.name = b.name AND a.score < b.score' ) ->where('b.score IS NULL') ->orderBy('a.score', 'DESC') ->getQuery() ->getResult();
추가 고려 사항:
대체 접근 방식에는 원하는 쿼리 결과를 나타내는 데이터베이스 보기를 만드는 것이 포함됩니다. . 그런 다음 이 보기를 Doctrine의 엔터티에 매핑하여 복잡한 쿼리 없이 데이터에 액세스할 수 있는 원활한 방법을 제공할 수 있습니다. 그러나 이 접근 방식은 성능 및 유지 관리 문제로 이어질 수 있으므로 일반적으로 권장되지 않습니다.
위 내용은 Doctrine DQL에서 그룹당 최대 행을 효율적으로 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!