首頁  >  文章  >  資料庫  >  如何使用 Doctrine 查詢語言 (DQL) 檢索每組的最大或最新行?

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

DDD
DDD原創
2024-11-18 22:32:02417瀏覽

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

學說查詢語言:檢索每個組的最大或最新行

為了使用以下方法檢索每個組的最大或最新行Doctrine Query Language (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

等效的Doctrine 查詢語言:

等效的Doctrine 查詢語言:

$kb = $em->createQuery(
    "SELECT a 
    FROM ShmupBundle:Score a
    INNER JOIN a.name ShmupBundle:Score b WITH a.score = b.score AND a.name = b.name GROUP BY b.name
    WHERE a.platform='keyboard'
    GROUP BY a.name
    ORDER BY b.score DESC, a.dateCreated DESC"
);
第一個嘗試:

錯誤:

[語意錯誤]第0 行,第73 列靠近「ShmupBundle:Score 」:錯誤:類別ShmupBundleEntityScore沒有協會命名名稱

$kb = $em->createQuery(
    "SELECT a 
    FROM ShmupBundle:Score a
    INNER JOIN ShmupBundle:Score b WITH a.score = b.score AND a.name = b.name GROUP BY a.name
    WHERE a.platform='keyboard'
    GROUP BY a.name
    ORDER BY b.score DESC, a.dateCreated DESC"
);
更正版本:

說明:

在原始查詢中,子用於計算每個名字的最高分數。然後將此結果與主查詢結合起來,以識別得分最高的行。

要將其轉換為 DQL,需要類似的方法。但是,a.name 欄位不作為 Score 實體中的關聯存在(如錯誤訊息所示)。為了解決這個問題,子查詢被編寫為單獨的實體連接,條件是 a.score 和 b.score 相等,且 a.name 和 b.name 相等。
use Doctrine\ORM\Query\Expr\Func;

$query = $em->createQuery(
    'SELECT a
    FROM Score AS a
    WHERE FUNC("ROW_NUMBER()", a.name) = 1
    ORDER BY a.score DESC'
);
此方法的替代方案的方法是修改 SQL 查詢以使用 ROW_NUMBER() 函數,該函數可以提供相同的結果而不需要子查詢。此方法使用的 DQL 取決於所使用的 Doctrine 版本。例如:

以上是如何使用 Doctrine 查詢語言 (DQL) 檢索每組的最大或最新行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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