首頁 >資料庫 >mysql教程 >如何使用 Doctrine 查詢語言 (DQL) 檢索每組的最大/最新記錄?

如何使用 Doctrine 查詢語言 (DQL) 檢索每組的最大/最新記錄?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-19 18:08:03307瀏覽

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

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn