교리 쿼리 언어: 그룹당 최대 또는 최신 행 검색
다음을 사용하여 각 그룹의 최대 또는 최신 행을 검색하려면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!