'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>)