>  기사  >  데이터 베이스  >  DQL(Docrine Query Language)에서 그룹당 최대 또는 최신 행을 검색하는 방법은 무엇입니까?

DQL(Docrine Query Language)에서 그룹당 최대 또는 최신 행을 검색하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-25 19:46:11238검색

How to Retrieve the Maximum or Latest Row per Group in Doctrine Query Language (DQL)?

Docrine Query Language: 그룹당 최대 또는 최신 행

문제:

SQL 문을 Doctrine Query Language로 변환 (DQL)은 각각에 대해 최대 또는 최신 행을 검색합니다. group.

SQL 문:

SELECT a.*
FROM score a
INNER JOIN (
  SELECT name, MAX(score) AS highest
  FROM score
  GROUP BY name
) b
ON a.score = b.highest AND a.name = b.name
GROUP BY name
ORDER BY b.highest DESC, a.dateCreated DESC

DQL 시도:

$kb = $em->createQuery(
    "SELECT a 
    FROM ShmupBundle:Score a
    INNER JOIN a.name ShmupBundle:Score b WITH a.score = b.score AND a.name = b.name GROUP BY b.name
    WHERE a.platform='keyboard'
    GROUP BY a.name
    ORDER BY b.score DESC, a.dateCreated DESC"
);

오류:

[Semantical Error] line 0, col 73 near 'ShmupBundle:Score': Error: Class ShmupBundle\Entity\Score has no association named name

해결책:

DQL 시도는 점수에 존재하지 않는 'name'이라는 연결을 사용합니다. 엔터티.

다시 작성된 SQL 문:

집계 함수를 사용하지 않으려면 SQL 문을 다음과 같이 다시 작성할 수 있습니다.

SELECT 
  a.* 
FROM
  score a 
  LEFT JOIN score b 
    ON a.name = b.name 
    AND a.score < b.score 
WHERE b.score IS NULL 
ORDER BY a.score DESC 

동등한 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

쿼리 빌더 버전:

쿼리 빌더를 사용하면 쿼리를 다음과 같이 작성할 수 있습니다.

$DM   = $this->get( 'Doctrine' )->getManager();
$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();

위 내용은 DQL(Docrine Query Language)에서 그룹당 최대 또는 최신 행을 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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