Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk Mendapatkan Baris Maksimum setiap Kumpulan dalam Doktrin DQL dengan Cekap?

Bagaimana untuk Mendapatkan Baris Maksimum setiap Kumpulan dalam Doktrin DQL dengan Cekap?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-17 20:59:01859semak imbas

How to Efficiently Retrieve the Maximum Row per Group in Doctrine DQL?

Bahasa Pertanyaan Doktrin: Mendapatkan Baris Maksimum atau Terkini bagi setiap Kumpulan

Dalam Bahasa Pertanyaan Doktrin (DQL), mendapatkan semula baris maksimum atau terkini setiap kumpulan boleh dicapai menggunakan subkueri dan cantuman.

Pernyataan Masalah:

Pernyataan SQL asal cuba untuk mendapatkan markah maksimum bagi setiap nama menggunakan cantuman dalaman pada subkueri. Walau bagaimanapun, terjemahan DQL dalam soalan mempamerkan ralat sintaks, menunjukkan bahawa persatuan bernama "nama" tidak wujud dalam entiti "Skor".

Penyelesaian:

Penyelesaian yang dicadangkan mengelakkan penggunaan fungsi agregat dan menumpukan pada penggunaan cantuman untuk mengecualikan baris yang mendapat markah lebih rendah. Pendekatan ini memastikan pertanyaan yang cekap dan menghapuskan keperluan untuk logik atau pengiraan tambahan.

DQL Equivalent:

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

Penjelasan:

Syarat gabungan kiri memastikan bahawa hanya baris dengan skor tertinggi bagi setiap nama disertakan dalam keputusan. Baris dengan skor yang lebih rendah akan ditapis keluar oleh klausa WHERE berikutnya, yang menyemak ketiadaan skor yang lebih tinggi untuk nama yang sama.

Alternatif Pembina Pertanyaan:

Pendekatan ini juga boleh dilaksanakan menggunakan Pembina Pertanyaan:

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

Pertimbangan Tambahan:

Pendekatan alternatif melibatkan mewujudkan paparan pangkalan data yang mewakili hasil pertanyaan yang diingini . Pandangan ini kemudiannya boleh dipetakan kepada entiti dalam Doktrin, menyediakan cara yang lancar untuk mengakses data tanpa memerlukan pertanyaan yang rumit. Walau bagaimanapun, pendekatan ini secara amnya tidak digalakkan kerana ia mungkin membawa kepada isu prestasi dan penyelenggaraan.

Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Baris Maksimum setiap Kumpulan dalam Doktrin DQL dengan Cekap?. 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