2012-05-14 26 views
6

Quiero contar dos cosas bajo diferentes condiciones en una consulta.MySQL - Contando dos cosas con diferentes condiciones

SELECT COUNT(*) AS count FROM table_name WHERE name = ? 

y

SELECT COUNT(*) as count FROM table_name WHERE address = ? AND port = ? 

Necesito tener un recuento de filas que tienen una cierta dirección y el puerto determinado, y un recuento separado para las filas que tienen un cierto nombre.

Soy consciente de que podía hacer

SELECT (COUNT*) as count FROM table_name WHERE (address = ? AND port = ?) OR name = ? 

Sin embargo esto es un solo cargo, y necesito que estén separados por lo que puede mostrar un mensaje más preciso para el usuario.

¿Cómo puedo hacer esto? ¡Ayuda sería apreciada!

Respuesta

19

¿Qué pasa simplemente:

SELECT 
    SUM(IF(name = ?, 1, 0)) AS name_count, 
    SUM(IF(address = ? AND port = ?, 1, 0)) AS addr_count 
FROM 
    table_name 
+0

Creo que esto sería lo mismo que bobwienholt en términos de rendimiento, pero si se indexan uno de 'name',' address' o 'port', puede ser más rápido agregar estas condiciones a la cláusula WHERE también:' WHERE name =? O (dirección =?Y puerto =?) ' –

4
SELECT SUM(CASE WHEN Name = ? THEN 1 ELSE 0 END) as name_match 
     , SUM(CASE WHEN Address = ? AND Port = ? THEN 1 ELSE 0 END) as address_match 
FROM table_name 
WHERE (address = ? AND port = ?) OR name = ? 
+0

De lo que puedo decir, esta consulta sería más rápido que los otros dos soluciones. ¿Estarías de acuerdo? – fruitcup

2

podría ser más fácil simplemente para hacer una Unión :

SELECT COUNT(*) AS count FROM table_name WHERE name = ? 
    GROUP BY name 
UNION ALL 
SELECT COUNT(*) as count FROM table_name WHERE address = ? AND port = ? 
    GROUP BY address, port 
+0

Nunca antes he usado un UNION, pero estoy pensando que la consulta de @bobwienholt sería más rápida. ¿Qué piensas? – fruitcup

+2

@DrAgonmoray Es una buena pregunta, y realmente no sé ... En realidad, me inclino a pensar que de esta manera sería más rápido ** si ** hay un índice en * nombre * así como * dirección * o * Puerto*. El recuento es muy rápido para una columna indexada, mientras que agregar una declaración de caso puede requerir un escaneo de todas las filas. YMMV :) – McGarnagle

+1

Tiendo a estar de acuerdo con la evaluación de dbaseman. Sin embargo, tiendo a usar mi método en consultas donde la cláusula WHERE está mirando columnas diferentes a las que estoy contando los valores. En ese caso, mi método probablemente sería más rápido. – bobwienholt

Cuestiones relacionadas