Rumah >pangkalan data >tutorial mysql >Mengapa PostgreSQL Saya LEFT JOIN Query Melipatgandakan Kiraan Daripada Memeliharanya?

Mengapa PostgreSQL Saya LEFT JOIN Query Melipatgandakan Kiraan Daripada Memeliharanya?

Linda Hamilton
Linda Hamiltonasal
2025-01-23 12:23:10411semak imbas

Why Does My PostgreSQL LEFT JOIN Query Multiply Counts Instead of Preserving Them?

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!

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