Bahasa Pertanyaan Doktrin: Mengambil Baris Maksimum atau Terkini Setiap Kumpulan
Untuk mendapatkan baris maksimum atau terkini bagi setiap kumpulan menggunakan Doctrine Query Language (DQL), adalah perlu untuk memanfaatkan subqueries untuk mengenal pasti baris sasaran. Langkah berikut menggariskan cara untuk mencapai ini:
Pertanyaan SQL Asal:
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
Persamaan Bahasa Pertanyaan Doktrin:
Percubaan Pertama:
$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:
[Ralat Semantik] baris 0, kol 73 berhampiran 'ShmupBundle:Score': Ralat : Kelas ShmupBundleEntityScore tidak mempunyai nama persatuan
Versi Dibetulkan:
$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" );
Penjelasan:
Dalam SQL asal pertanyaan, subkueri digunakan untuk mengira skor maksimum bagi setiap nama. Hasil ini kemudiannya digabungkan dengan pertanyaan utama untuk mengenal pasti baris dengan skor tertinggi.
Untuk menterjemahkannya ke dalam DQL, pendekatan yang serupa diperlukan. Walau bagaimanapun, medan a.name tidak wujud sebagai persatuan dalam entiti Skor (seperti yang ditunjukkan oleh mesej ralat). Untuk membetulkannya, subkueri ditulis sebagai gabungan entiti yang berasingan, dengan syarat a.skor dan b.skor adalah sama dan a.nama dan b.nama adalah sama.
Alternatif kepada pendekatan ini adalah untuk menyemak semula pertanyaan SQL untuk menggunakan fungsi ROW_NUMBER(), yang boleh memberikan hasil yang sama tanpa memerlukan subquery. DQL yang digunakan untuk kaedah ini bergantung pada versi Doktrin yang digunakan. Contohnya:
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' );
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Baris Maksimum atau Terkini Setiap Kumpulan Menggunakan Bahasa Pertanyaan Doktrin (DQL)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!