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

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

Susan Sarandon
풀어 주다: 2024-11-25 19:46:11
원래의
260명이 탐색했습니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿