學說查詢語言:檢索每個組的最大或最新行
為了使用以下方法檢索每個組的最大或最新行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中文網其他相關文章!