>데이터 베이스 >MySQL 튜토리얼 >DQL(Docrine Query Language)을 사용하여 그룹당 최대/최신 레코드를 검색하는 방법은 무엇입니까?

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

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-19 18:08:03272검색

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

Docrine Query Language: 그룹당 최대/최신 레코드 검색

DQL(Docrine Query Language)은 데이터베이스에서 데이터를 검색하는 강력한 기능을 제공합니다. 일반적인 작업 중 하나는 데이터세트의 각 그룹에 대한 최대 또는 최신 행을 가져오는 것입니다.

SQL을 DQL로 변환

귀하의 경우 DQL에 대한 다음 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 동등 항목

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, a.dateCreated DESC

설명

이 DQL 쿼리 현재 행(a)을 동일한 이름을 가진 행(b)과 점수가 더 높은 행을 비교하기 위해 Left 조인을 사용합니다. 특정 이름에 대해 더 높은 점수를 가진 행이 없으면 b.score는 NULL이 되며 이는 결과를 필터링하는 데 사용됩니다.

대체 구문

또는, 직관적이고 유연한 구성 방법을 제공하는 쿼리 빌더 구문을 사용할 수 있습니다. 쿼리:

$qb = $em->createQueryBuilder();
$qb->select('a')
   ->from('AppBundle:Score', 'a')
   ->leftJoin('AppBundle:Score', 'b', 'WITH', 'a.name = b.name AND a.score < b.score')
   ->where('b.score IS NULL')
   ->orderBy('a.score', 'DESC')
   ->orderBy('a.dateCreated', 'DESC');

$results = $qb->getQuery()->getResult();

추가 고려 사항

성능 최적화를 위해 점수 열과 이름 및 점수 열 조합에 대한 인덱스 생성을 고려하세요.

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

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