2012-01-28 17 views
5

Ho una tabella utenti (utente, pass, email) e voglio ottenere il conteggio dell'utente dove user = 'someuser' e il conteggio dell'e-mail dove email = 'someemail' in una query e mi è venuto in mente che:Selezionare due conteggi in una query

SELECT (

SELECT COUNT(user) 
FROM users 
WHERE user = 'someuser' 
), (

SELECT COUNT(email) 
FROM users 
WHERE email = 'someemail' 
) 
FROM users 

Ma mi chiedo se c'è un modo migliore per farlo? Grazie in anticipo :)

+0

Non credo che avere due colonne aggregate su due tabelle diverse funzioni senza questo approccio di subquery, quindi penso che la soluzione sia ok. – Gregor

+0

dai un'occhiata a [questa risposta] (http://stackoverflow.com/a/5177386/944634) –

+0

@ParagBafna: questo è un buon approccio, e noto che richiede la "promozione" di MySQL dei booleani per i tipi interi. (Non sappiamo che l'RDBMS di lam3r4370 fa questo.) – pilcrow

risposta

8

No, questo è il modo corretto di farlo nel tuo caso. I tuoi conteggi saranno probabilmente sempre pari a 0 o 1 e saranno soddisfatti da un indice NC.

Nel caso in cui si desidera acquisire più dati, può essere più efficace di farlo in questo modo:

select sum(case when user = 'x' then 1 end) UserCount, sum(case when email = 'x' then 1 end) EmailCount 
from users 

Questo sarà sempre la scansione della tabella. Dipende dai dati che la versione è più veloce. Nel tuo caso, il tuo è più veloce.

+0

La tua soluzione è peggiore della soluzione proposta nel post originale. Perché la tua query effettua una scansione completa della tabella una volta che non ha una clausola where. –

+0

@arpf hai ragione nel fatto che una scansione della tabella avviene sempre (è pericoloso quindi la chiamo nella risposta). La mia versione è migliore, tuttavia, se è sempre necessaria una scansione della tabella. Inoltre, nota la prima frase: menziono quel compromesso. – usr

Problemi correlati