Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mendapatkan Baris Maksimum atau Terkini setiap Kumpulan dalam Bahasa Pertanyaan Doktrin (DQL)?

Bagaimana untuk Mendapatkan Baris Maksimum atau Terkini setiap Kumpulan dalam Bahasa Pertanyaan Doktrin (DQL)?

Susan Sarandon
Susan Sarandonasal
2024-11-25 19:46:11310semak imbas

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

Bahasa Pertanyaan Doktrin: Baris Maksimum atau Terkini bagi setiap Kumpulan

Masalah:

Menterjemah pernyataan SQL kepada Bahasa Pertanyaan Doktrin (DQL) untuk mendapatkan baris maksimum atau terkini untuk setiap baris kumpulan.

Pernyataan 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

DQL Percubaan:

$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"
);

Ralat:

[Semantical Error] line 0, col 73 near 'ShmupBundle:Score': Error: Class ShmupBundle\Entity\Score has no association named name

Penyelesaian:

Percubaan DQL untuk gunakan persatuan bernama 'nama', yang tidak wujud dalam Skor entiti.

Penyata SQL Ditulis Semula:

Untuk mengelak daripada menggunakan fungsi agregat, pernyataan SQL boleh ditulis semula sebagai:

SELECT 
  a.* 
FROM
  score a 
  LEFT JOIN score b 
    ON a.name = b.name 
    AND a.score < b.score 
WHERE b.score IS NULL 
ORDER BY a.score DESC 

Setaraf 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

Versi Pembina Pertanyaan:

Menggunakan pembina pertanyaan, pertanyaan boleh ditulis sebagai:

$DM   = $this->get( 'Doctrine' )->getManager();
$repo = $DM->getRepository( 'AppBundle\Entity\Score' );
$results = $repo->createQueryBuilder( 'a' )
                ->select( 'a' )
                ->leftJoin(
                    'AppBundle\Entity\Score',
                    'b',
                    'WITH',
                    'a.name = b.name AND a.score < b.score'
                )
                ->where( 'b.score IS NULL' )
                ->orderBy( 'a.score','DESC' )
                ->getQuery()
                ->getResult();

Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Baris Maksimum atau Terkini setiap Kumpulan dalam Bahasa Pertanyaan Doktrin (DQL)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn