2012-02-11 10 views
11

Ho una semplice tabella di installa:MySQL - Come faccio a contare i nulli e non i null?

  • prod_code
  • email
  • install_slot

Se l'install_slot è NULL, allora si tratta di una disposizione di installazione di slot. Non nulla - quindi, slot utilizzato. Devo restituire un risultato delle installazioni totali per un dato prodotto ed e-mail, nonché un risultato delle installazioni usate per un determinato prodotto e e-mail. Immagino di poterlo fare con due domande, ma mi chiedo se c'è un modo SQL per fare tutto in uno?

Ho provato quanto segue come ipotesi selvaggia, ma non ha funzionato . solo

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

Non ti capisco, leggerezza. Quale parte della frase con il punto interrogativo in esso, a cominciare da "I guess" non capisci? – Volomike

+0

Niente di tutto ciò. Io non sto parlando di quella frase, sono io. –

+0

Huh? Non ti seguo ancora. – Volomike

risposta

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 conta NOT NULL valori.

+0

Wow. Sono sorpreso che abbia funzionato davvero. Nella mia mente mi sembra che non funzionerebbe, ma lo fa. – Volomike

+0

@Lightness Races in Orbit: è anche una cattiva abitudine dire "ha funzionato"? –

3

La soluzione offerta non ha funzionato per me. Ho dovuto modificare come segue:

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 
Problemi correlati