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

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

DDD
DDD원래의
2024-11-18 22:32:02418검색

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

교리 쿼리 언어: 그룹당 최대 또는 최신 행 검색

다음을 사용하여 각 그룹의 최대 또는 최신 행을 검색하려면 DQL(Docrine Query Language)에서는 하위 쿼리를 활용하여 대상 행을 식별해야 합니다. 다음 단계에서는 이를 달성하는 방법을 설명합니다.

원래 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

동등한 교리 쿼리 언어:

먼저 시도:

$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"
);

오류:

[의미적 오류] 0행, 'ShmupBundle:Score' 근처의 73열: 오류: 클래스 ShmupBundleEntityScore에 없음 이름이 붙은 협회 이름

수정 버전:

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

설명:

원래 SQL 쿼리에서는 하위 쿼리를 사용하여 각 이름의 최대 점수를 계산합니다. 그런 다음 이 결과를 기본 쿼리와 결합하여 점수가 가장 높은 행을 식별합니다.

이를 DQL로 변환하려면 유사한 접근 방식이 필요합니다. 그러나 a.name 필드는 Score 엔터티에 연결로 존재하지 않습니다(오류 메시지에 표시됨). 이 문제를 해결하기 위해 하위 쿼리는 a.score와 b.score가 동일하고 a.name과 b.name이 동일하다는 조건을 사용하여 별도의 엔터티 조인으로 작성됩니다.

이 접근 방식의 대안 서브 쿼리 없이도 동일한 결과를 제공할 수 있는 ROW_NUMBER() 함수를 사용하도록 SQL 쿼리를 수정하는 것입니다. 이 방법에 사용되는 DQL은 사용되는 Doctrine 버전에 따라 다릅니다. 예:

use Doctrine\ORM\Query\Expr\Func;

$query = $em->createQuery(
    'SELECT a
    FROM Score AS a
    WHERE FUNC("ROW_NUMBER()", a.name) = 1
    ORDER BY a.score DESC'
);

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

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