Rumah >pangkalan data >tutorial mysql >Mengapa PostgreSQL Saya LEFT JOIN Query Melipatgandakan Kiraan Daripada Memeliharanya?
PostgreSQL LEFT JOIN: Pendaraban Kiraan Baris Tidak Dijangka
Pertanyaan PostgreSQL 9.1 menggunakan berbilang LEFT JOIN secara tidak dijangka mendarabkan bilangan baris dan bukannya mengekalkannya. Pertanyaan bertujuan untuk mendapatkan ID pengguna, baki akaun, kiraan lawatan kedai runcit dan kiraan lawatan pasar ikan. Pertanyaan yang cacat menghasilkan kiraan yang salah, menunjukkan nilai berulang dan bukannya kiraan sebenar.
Isu ini timbul daripada perintah pemprosesan JOIN dari kiri ke kanan PostgreSQL. JOIN seterusnya mereplikasi baris daripada gabungan sebelumnya, yang membawa kepada mengira inflasi. Sebagai contoh, jika terdapat 3 lawatan runcit dan 12 lawatan pasar ikan, keputusan menunjukkan 12 penyertaan untuk setiap satu dan bukannya 3 dan 12 yang dijangkakan.
Penyelesaian melibatkan pra-agregat kiraan lawatan sebelum menyertai. Ini mengelakkan masalah pendaraban baris. Pertanyaan yang diperbetulkan ialah:
<code class="language-sql">SELECT u.id, u.account_balance, g.grocery_visits, f.fishmarket_visits FROM users u LEFT JOIN ( SELECT user_id, count(*) AS grocery_visits FROM grocery GROUP BY user_id ) g ON g.user_id = u.id LEFT JOIN ( SELECT user_id, count(*) AS fishmarket_visits FROM fishmarket GROUP BY user_id ) f ON f.user_id = u.id ORDER BY u.id;</code>
Pertanyaan yang disemak ini dengan betul mengembalikan kiraan individu untuk lawatan runcit dan pasar ikan bagi setiap pengguna, menyelesaikan isu pendaraban. Sebagai contoh, jika pengguna mempunyai 3 lawatan runcit dan 4 lawatan pasar ikan, output menggambarkan ini dengan tepat, mengelakkan ulangan yang salah yang dilihat dalam pertanyaan asal.
Atas ialah kandungan terperinci Mengapa PostgreSQL Saya LEFT JOIN Query Melipatgandakan Kiraan Daripada Memeliharanya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!