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

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

DDD
發布: 2024-11-18 22:32:02
原創
467 人瀏覽過

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板