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

DDD
Lepaskan: 2024-11-18 22:32:02
asal
416 orang telah melayarinya

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
Salin selepas log masuk

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"
);
Salin selepas log masuk

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"
);
Salin selepas log masuk

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'
);
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan