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