'e.id'
là một hằng số chuỗi, vì vậy COUNT('e.id')
chỉ là một cách nói khó hiểu, gây hiểu lầm COUNT(*)
.
COUNT(e.id)
mặt khác, đếm tất cả các hàng trong kết quả mà e.id IS NOT NULL
- kể từ khi count()
không tính giá trị NULL.
Như bạn có thể thấy, thậm chí có hai chức năng riêng biệt bên trong. Và cần lưu ý rằng count(*)
nhanh hơn một chút. Vì vậy, hãy sử dụng nó trừ khi bạn cần biến thể thứ hai. Có liên quan:
Bạn có thể phản đối bằng:
"Nhưng e.id
là PRIMARY KEY
trong tổng số core_employments
, vì vậy nó được định nghĩa NOT NULL
! "
Nhưng điều đó sẽ bỏ qua LEFT JOIN
có điều kiện trong truy vấn của bạn vẫn giới thiệu NULL
các giá trị trong NOT NULL
của bạn cột, nơi các điều kiện tham gia không được đáp ứng. Có liên quan:
Điều đó nói rằng, LEFT [OUTER] JOIN
cũng gây hiểu lầm. Điều kiện sau
having("COUNT(e.id) = 1")
buộc nó hoạt động như một [INNER] JOIN
đơn giản . Khi bạn đã khắc phục điều đó, bạn cũng có thể đơn giản hóa thành:
having("COUNT(*) = 1")
Và nếu tất cả những gì bạn quan tâm là ít nhất là một hàng có liên quan tồn tại trong core_employments
, đang dịch sang having("COUNT(*) >= 1")
, kỹ thuật ưu việt (rõ ràng hơn, nhanh hơn) trong các trường hợp đơn giản sẽ là EXISTS
bán tham gia
:
WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)