Bahasa Pertanyaan Doktrin: Mendapatkan Rekod Maksimum/Terkini Bagi Setiap Kumpulan
Bahasa Pertanyaan Doktrin (DQL) menawarkan keupayaan berkuasa untuk mendapatkan semula data daripada pangkalan data. Satu tugas biasa ialah mendapatkan baris maksimum atau terkini untuk setiap kumpulan dalam set data.
Menterjemah SQL kepada DQL
Dalam kes anda, anda sedang bergelut untuk menterjemah mengikuti pernyataan SQL kepada DQL:
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
Pertanyaan ini bertujuan untuk mencari skor tertinggi bagi setiap nama, bersama-sama lajur lain dan menyusun keputusan mengikut skor dan kemudian mengikut tarikh dibuat.
DQL Equivalent
Untuk mencapai fungsi yang sama dalam DQL, anda boleh menggunakan pertanyaan berikut:
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, a.dateCreated DESC
Penjelasan
Pertanyaan DQL ini menggunakan gabungan kiri untuk membandingkan baris semasa (a) dengan baris yang mempunyai nama yang sama (b) dengan skor yang lebih tinggi. Jika tiada baris dengan skor yang lebih tinggi untuk nama yang diberikan, b.skor akan menjadi NULL, yang digunakan untuk menapis keputusan.
Sintaks Alternatif
Sebagai alternatif, anda boleh menggunakan sintaks pembina pertanyaan, yang menawarkan cara intuitif dan fleksibel untuk membina pertanyaan:
$qb = $em->createQueryBuilder(); $qb->select('a') ->from('AppBundle:Score', 'a') ->leftJoin('AppBundle:Score', 'b', 'WITH', 'a.name = b.name AND a.score < b.score') ->where('b.score IS NULL') ->orderBy('a.score', 'DESC') ->orderBy('a.dateCreated', 'DESC'); $results = $qb->getQuery()->getResult();
Pertimbangan Tambahan
Untuk pengoptimuman prestasi, pertimbangkan untuk mencipta indeks pada lajur skor dan pada gabungan nama dan lajur skor.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Rekod Maksimum/Terkini Setiap Kumpulan Menggunakan Bahasa Pertanyaan Doktrin (DQL)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!