>  기사  >  데이터 베이스  >  Doctrine DQL에서 그룹당 최대 행을 효율적으로 검색하는 방법은 무엇입니까?

Doctrine DQL에서 그룹당 최대 행을 효율적으로 검색하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-17 20:59:01859검색

How to Efficiently Retrieve the Maximum Row per Group in Doctrine DQL?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.