Rumah >pangkalan data >tutorial mysql >Mengapa SERTAI KIRI Saya Tidak Mengembalikan Sifar Dikira dalam PostgreSQL?
PostgreSQL LEFT JOIN: Memastikan Kiraan Sifar Dikembalikan
Isu biasa dengan PostgreSQL LEFT JOIN
ialah kegagalan untuk mengembalikan baris dengan kiraan sifar. Ini berlaku apabila keadaan penapisan diletakkan dengan tidak betul.
Pertimbangkan pertanyaan ini, direka bentuk untuk mengira item peperiksaan bagi setiap organisasi, tetapi hanya mengembalikan organisasi dengan kiraan melebihi sifar:
<code class="language-sql">select o.name as organisation_name, coalesce(COUNT(exam_items.id)) as total_used from organisations o left join exam_items e on o.id = e.organisation_id where e.item_template_id = #{sanitize(item_template_id)} and e.used = true group by o.name order by o.name</code>
Membetulkan Pertanyaan
Masalahnya terletak pada klausa WHERE
. Syarat yang diletakkan di sini menapis selepas penyertaan, dengan berkesan mengalih keluar organisasi kiraan sifar. Penyelesaiannya adalah untuk memindahkan syarat penapisan ke dalam klausa JOIN
itu sendiri:
<code class="language-sql">SELECT o.name AS organisation_name, count(e.id) AS total_used FROM organisations o LEFT JOIN exam_items e ON e.organisation_id = o.id AND e.item_template_id = #{sanitize(item_template_id)} AND e.used GROUP BY o.name ORDER BY o.name;</code>
Dengan menyepadukan penapis dalam JOIN
, kami memastikan bahawa hanya baris yang sepadan disertakan dalam operasi gabungan. Ini menghalang pengecualian tidak sengaja organisasi dengan kiraan sifar.
Nota Penting:
COUNT()
: Tidak seperti banyak fungsi agregat, COUNT()
tidak pernah kembali NULL
. Oleh itu, COALESCE(COUNT(col))
adalah berlebihan.COUNT()
pada lajur NOT NULL
, atau pastikan syarat cantuman menjamin nilai bukan nol.Atas ialah kandungan terperinci Mengapa SERTAI KIRI Saya Tidak Mengembalikan Sifar Dikira dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!