2012-01-28 8 views
5

Tengo usuarios (usuario, pass, correo electrónico) de mesa y quiero obtener el recuento de usuario donde el usuario = 'someuser' y el recuento de correo electrónico donde el correo electrónico = 'someemail' en una consulta y se me ocurrió eso:Seleccionar dos cargos en una consulta

SELECT (

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

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

Pero me pregunto si hay una mejor manera de hacerlo. Gracias de antemano :)

+0

No creo que tener dos columnas agregadas en dos tablas diferentes funcione sin este enfoque de subconsulta, por lo que creo que su solución está bien. – Gregor

+0

eche un vistazo a [esta respuesta] (http://stackoverflow.com/a/5177386/944634) –

+0

@ParagBafna: ese es un buen enfoque, y observo que requiere la "promoción" de MySQL de booleanos a tipos integrales. (No sabemos que el RDBMS de lam3r4370 hace esto). – pilcrow

Respuesta

8

No, esa es la forma correcta de hacerlo en su caso. Sus conteos probablemente siempre serán 0 o 1 y estarán satisfechos de un índice NC.

En caso de que desee escanear más datos, puede ser más eficiente que hacerlo de esta manera:

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

Esto siempre analiza la tabla. Depende de los datos, que versión es más rápida. En tu caso, el tuyo es más rápido.

+0

Su solución es peor que la solución propuesta en la publicación original. Debido a que su consulta hace un escaneo completo de la tabla una vez que no tiene una cláusula where. –

+0

@arpf tienes razón en que siempre ocurre un escaneo de tabla (eso es peligroso, así que lo digo en la respuesta). Sin embargo, mi versión es mejor si siempre se requería una exploración de tabla. Además, tenga en cuenta la primera oración: menciono esa compensación. – usr

Cuestiones relacionadas