'e.id' adalah konstanta string, jadi COUNT('e.id') hanyalah cara yang canggung dan menyesatkan untuk mengatakan COUNT(*) .
COUNT(e.id) , di sisi lain, menghitung semua baris dalam hasil di mana e.id IS NOT NULL - sejak count() tidak menghitung nilai NULL.
Seperti yang Anda lihat, bahkan ada dua fungsi terpisah secara internal. Dan perlu diperhatikan bahwa count(*) sedikit lebih cepat. Jadi gunakan itu kecuali Anda butuh varian kedua. Terkait:
Anda mungkin membalas dengan:
"Tapi e.id adalah PRIMARY KEY dari core_employments , jadi didefinisikan NOT NULL !"
Tapi itu akan mengabaikan bersyarat LEFT JOIN dalam kueri Anda yang masih memperkenalkan NULL nilai dalam NOT NULL . Anda kolom, di mana kondisi bergabung tidak terpenuhi. Terkait:
Artinya, LEFT [OUTER] JOIN menyesatkan juga. Kondisi selanjutnya
having("COUNT(e.id) = 1")
memaksanya untuk bertindak seperti [INNER] JOIN biasa . Setelah Anda memperbaikinya, Anda dapat menyederhanakannya menjadi:
having("COUNT(*) = 1")
Dan jika Anda hanya peduli setidaknya satu baris terkait ada di core_employments , menerjemahkan ke having("COUNT(*) >= 1") , teknik superior (lebih jelas, lebih cepat) dalam kasus sederhana adalah EXISTS setengah bergabung
:
WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)