Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mendapatkan Rekod Maksimum/Terkini Setiap Kumpulan Menggunakan Bahasa Pertanyaan Doktrin (DQL)?

Bagaimana untuk Mendapatkan Rekod Maksimum/Terkini Setiap Kumpulan Menggunakan Bahasa Pertanyaan Doktrin (DQL)?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-19 18:08:03307semak imbas

How to Retrieve the Maximum/Latest Record Per Group Using Doctrine Query Language (DQL)?

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!

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