Menyelesaikan masalah PostgreSQL's DISTINCT ON Clause mismatch Error
FasalPostgreSQL DISTINCT ON
memerlukan ungkapan ORDER BY
untuk memadankan dengan tepat lajur yang berbeza. Mencuba pertanyaan dengan ungkapan yang berbeza akan mengakibatkan ralat. Hanya menambah address_id
sebagai elemen pertama dalam klausa ORDER BY
, manakala penyelesaian kepada ralat, mungkin tidak mengembalikan hasil yang dimaksudkan.
Berikut ialah kaedah alternatif untuk mendapatkan semula data yang betul tanpa mengubah ORDER BY
dalam klausa DISTINCT ON
:
Kaedah 1: Pendekatan-N-Per-Kumpulan Terhebat (DBMS-Agnostik)
Kaedah ini menggunakan subkueri untuk mencari purchased_at
maksimum bagi setiap address_id
, kemudian bergabung kembali ke jadual asal untuk mendapatkan semula baris lengkap:
SELECT t1.* FROM purchases t1 JOIN ( SELECT address_id, max(purchased_at) as max_purchased_at FROM purchases WHERE product_id = 1 GROUP BY address_id ) t2 ON t1.address_id = t2.address_id AND t1.purchased_at = t2.max_purchased_at ORDER BY t1.purchased_at DESC;
Kaedah 2: Penyelesaian Khusus PostgreSQL
Pendekatan ini memanfaatkan pertanyaan bersarang, menggunakan DISTINCT ON
dalam pertanyaan dalaman untuk memilih baris yang diingini bagi setiap address_id
, dan kemudian memesan hasil akhir seperti yang diperlukan dalam pertanyaan luar:
SELECT * FROM ( SELECT DISTINCT ON (address_id) * FROM purchases WHERE product_id = 1 ORDER BY address_id, purchased_at DESC ) t ORDER BY purchased_at DESC;
Pendekatan ini menyediakan penyelesaian yang fleksibel untuk mendapatkan semula data yang diperlukan sambil mengekalkan susunan pengisihan yang diingini, mengelakkan keperluan untuk berkompromi pada ungkapan DISTINCT ON
klausa ORDER BY
.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan DISTINCT PostgreSQL ON PESANAN YANG Tidak Padan MENGIKUT Ralat Klausa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!