Bagaimana untuk Mendapatkan Baris Maksimum atau Terkini setiap Kumpulan dalam Bahasa Pertanyaan Doktrin (DQL)?

Susan Sarandon
Lepaskan: 2024-11-25 19:46:11
asal
241 orang telah melayarinya

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

Bahasa Pertanyaan Doktrin: Baris Maksimum atau Terkini bagi setiap Kumpulan

Masalah:

Menterjemah pernyataan SQL kepada Bahasa Pertanyaan Doktrin (DQL) untuk mendapatkan baris maksimum atau terkini untuk setiap baris kumpulan.

Pernyataan SQL:

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

DQL Percubaan:

$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:

[Semantical Error] line 0, col 73 near 'ShmupBundle:Score': Error: Class ShmupBundle\Entity\Score has no association named name
Salin selepas log masuk

Penyelesaian:

Percubaan DQL untuk gunakan persatuan bernama 'nama', yang tidak wujud dalam Skor entiti.

Penyata SQL Ditulis Semula:

Untuk mengelak daripada menggunakan fungsi agregat, pernyataan SQL boleh ditulis semula sebagai:

SELECT 
  a.* 
FROM
  score a 
  LEFT JOIN score b 
    ON a.name = b.name 
    AND a.score < b.score 
WHERE b.score IS NULL 
ORDER BY a.score DESC 
Salin selepas log masuk

Setaraf DQL:

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

Versi Pembina Pertanyaan:

Menggunakan pembina pertanyaan, pertanyaan boleh ditulis sebagai:

$DM   = $this->get( 'Doctrine' )->getManager();
$repo = $DM->getRepository( 'AppBundle\Entity\Score' );
$results = $repo->createQueryBuilder( 'a' )
                ->select( 'a' )
                ->leftJoin(
                    'AppBundle\Entity\Score',
                    'b',
                    'WITH',
                    'a.name = b.name AND a.score < b.score'
                )
                ->where( 'b.score IS NULL' )
                ->orderBy( 'a.score','DESC' )
                ->getQuery()
                ->getResult();
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Baris Maksimum atau Terkini setiap Kumpulan dalam 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan