Perbezaan antara pernyataan GROUP BY antara PostgreSQL dan MySQL
Pengenalan
Apabila memindahkan pertanyaan daripada MySQL ke PostgreSQL, anda sering menghadapi ralat apabila menggunakan klausa GROUP BY. Artikel ini akan menyelami perbezaan antara GROUP BY dalam MySQL dan PostgreSQL dan menyediakan cara untuk menyelesaikan ralat ini.
Ralat
Apabila melaksanakan pertanyaan berikut dalam PostgreSQL:
<code class="language-sql">SELECT `availables`.* FROM `availables` INNER JOIN `rooms` ON `rooms`.id = `availables`.room_id WHERE (rooms.hotel_id = 5056 AND availables.bookdate BETWEEN '2009-11-22' AND '2009-11-24') GROUP BY availables.bookdate ORDER BY availables.updated_at</code>
PostgreSQL mungkin mengembalikan ralat berikut:
<code>ERROR: column "availables.id" must appear in the GROUP BY clause or be used in an aggregate function</code>
Perbezaan
Dalam MySQL, klausa GROUP BY membenarkan medan bukan agregat tertentu untuk disertakan dalam hasil pertanyaan. Walau bagaimanapun, PostgreSQL mengikut standard SQL dan memerlukan semua medan bukan agregat mesti muncul dalam klausa GROUP BY atau digunakan dalam fungsi agregat.
Penyelesaian: DISTINCT ON
Untuk mensimulasikan kelakuan MySQL GROUP BY dalam PostgreSQL, kita boleh menggunakan ungkapan DISTINCT ON. DISTINCT ON membolehkan kami memilih baris unik bagi setiap kumpulan berdasarkan lajur yang ditentukan. Dalam contoh yang diberikan, pertanyaan berikut akan berfungsi dalam PostgreSQL:
<code class="language-sql">SELECT DISTINCT ON (availables.bookdate) `availables`.* FROM `availables` INNER JOIN `rooms` ON `rooms`.id = `availables`.room_id WHERE (rooms.hotel_id = 5056 AND availables.bookdate BETWEEN '2009-11-22' AND '2009-11-24') ORDER BY availables.bookdate, availables.updated_at</code>
Pertanyaan ini akan mengembalikan baris ke untuk setiap nilai unik availables.bookdate, mensimulasikan gelagat GROUP BY MySQL dengan berkesan. Ambil perhatian bahawa untuk memastikan hasil yang konsisten, kami menambah availables.updated_at
pada klausa ORDER BY
supaya DISTINCT ON
sentiasa memilih baris yang sama. Tanpa ini, DISTINCT ON
boleh mengembalikan baris yang berbeza setiap kali ia dilaksanakan.
Atas ialah kandungan terperinci Bagaimana untuk Menghijrahkan MySQL GROUP OLEH Pertanyaan ke PostgreSQL Dengan Betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!