Doctrine 查詢語言:檢索每組的最大/最新記錄
Doctrine 查詢語言(DQL) 提供了從資料庫檢索資料的強大功能。一項常見任務是取得資料集中每個群組的最大或最新行。
將SQL 轉換為DQL
在您的情況下,您正在努力將以下SQL 語句傳送到DQL:
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) 比較,且分數較高。如果給定名稱沒有得分較高的行,則 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();
其他注意事項
為了效能最佳化,請考慮建立索引在分數列以及名稱和分數列的組合上。
以上是如何使用 Doctrine 查詢語言 (DQL) 檢索每組的最大/最新記錄?的詳細內容。更多資訊請關注PHP中文網其他相關文章!