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

Bagaimana untuk Mendapatkan Baris Maksimum atau Terkini Setiap Kumpulan Menggunakan Bahasa Pertanyaan Doktrin (DQL)?

DDD
DDDasal
2024-11-18 22:32:02486semak imbas

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

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!

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