2012-02-11 26 views
11

Tôi có một bảng đơn giản của cài đặt:MySQL - Làm thế nào để tôi đếm Nulls và không Nulls?

  • prod_code
  • email
  • install_slot

Nếu install_slot là NULL, sau đó nó là một sẵn cài đặt khe. Không rỗng - sau đó, sử dụng vị trí. Tôi cần trả lại kết quả của tổng số lượt cài đặt cho một sản phẩm và email nhất định, cũng như kết quả của lượt cài đặt đã sử dụng cho một sản phẩm và email nhất định. Tôi đoán tôi có thể làm điều này với hai truy vấn, nhưng tự hỏi nếu có một cách SQL để làm tất cả trong một?

Tôi đã thử những điều sau đây như một dự đoán hoang dã, nhưng nó không hoạt động.

SELECT 
    i1.`prod_code`, 
    COUNT(i1.`email`) AS total_installs, 
    COUNT(ISNULL(i2.`install_slot`)) AS used_installs 
FROM 
    `installs` AS i1 
JOIN 
    `installs` AS i2 
ON 
    i1.`prod_code` = i2.`prod_code` 
WHERE 
    i1.`email` = '[email protected]' 
GROUP BY 
    i1.`prod_code`,i2.`prod_code` 
+1

Tôi không hiểu bạn, Nhẹ nhàng. Phần nào của câu có dấu hỏi trong đó, bắt đầu bằng "Tôi đoán" bạn có hiểu không? – Volomike

+0

Không ai trong số đó. Tôi không nói về câu đó, tôi là –

+0

Huh? Tôi vẫn không theo bạn. – Volomike

Trả lời

24
SELECT prod_code, 
     COUNT(email) AS total_installs, 
     COUNT(install_slot) AS used_installs 
FROM installs 
WHERE email='[email protected]' 
GROUP BY prod_code 

COUNT đếm NOT NULL giá trị duy nhất.

+0

Chà. Tôi ngạc nhiên khi thực sự làm việc. Trong tâm trí của tôi có vẻ như với tôi như nó sẽ không hoạt động, nhưng nó có. – Volomike

+0

@Lightness Races trong Orbit: đó cũng là một thói quen xấu để nói 'nó hoạt động'? –

3

Giải pháp được cung cấp không hoạt động đối với tôi. Tôi phải sửa đổi như sau:

SELECT prod_code, 
     COUNT(NULLIF(email,'')) AS total_installs, 
     COUNT(NULLIF(install_slot,'')) AS used_installs 
FROM installs 
WHERE email='[email protected]' 
GROUP BY prod_code 
Các vấn đề liên quan