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
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" );
Ralat:
[Semantical Error] line 0, col 73 near 'ShmupBundle:Score': Error: Class ShmupBundle\Entity\Score has no association named name
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
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
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();
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!