Truy vấn bạn đang cố gắng thực hiện với học thuyết có liên quan đến lớn nhất-n-mỗi-nhóm . Để sử dụng một truy vấn phụ và sau đó kết hợp với truy vấn chính, hãy xử lý mọi thứ phức tạp với học thuyết. Vì vậy, dưới đây là phiên bản SQL được viết lại để có được kết quả tương tự mà không cần sử dụng bất kỳ hàm tổng hợp nào:
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
Để chuyển đổi truy vấn trên tương đương với học thuyết hoặc DQL rất dễ dàng, dưới đây là phiên bản DQL của SQL trên:
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
Hoặc với trình tạo truy vấn, bạn có thể viết một cái gì đó giống như tôi đã thử nghiệm bên dưới với symfony 2.8 bằng cách sử dụng Lược đồ DEMO
$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();
Một ý tưởng khác là tạo một khung nhìn bằng cách sử dụng truy vấn của bạn trong cơ sở dữ liệu và trong symfony, hãy tạo một thực thể đặt tên khung nhìn trong chú thích bảng và chỉ cần bắt đầu gọi thực thể của bạn, nó sẽ cho kết quả trả về bởi truy vấn của bạn nhưng cách làm này không được khuyến khích chỉ là một cách khắc phục tạm thời .