¿Cómo hacer recuentos múltiples en una consulta?

11

Cuento registros con consultas como

SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%something%'
SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%another%'
SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%word%'

Para cada recuento, mysql necesita caminar por la mesa, y este es un gran problema si tiene una tabla larga y numerosas consultas.

Me pregunto si hay una manera de hacer todos los recuentos en una consulta. En este caso, cuando mysql recorre cada fila, procesará todos los recuentos y no será necesario escanear la tabla completa una y otra vez.

Googlebot
fuente
Para agregar a las respuestas correctas, las consultas sugeridas solo escanean la tabla una vez.

Respuestas:

20

Para obtener un recuento de cada uno de ellos, puede intentar

SELECT
    COUNT(CASE WHEN `col1` LIKE '%something%' THEN 1 END) AS count1,
    COUNT(CASE WHEN `col1` LIKE '%another%' THEN 1 END) AS count2,
    COUNT(CASE WHEN `col1` LIKE '%word%' THEN 1 END) AS count3
FROM `table1`; 
Aaron W.
fuente
16

Similar a la solución de Aaron, sintaxis más corta:

SELECT
    SUM(col1 LIKE '%something%') AS count1,
    SUM(col1 LIKE '%another%') AS count2,
    SUM(col1 LIKE '%word%') AS count3
FROM `table1`

La expresión LIKE produce un resultado booleano. TRUEes 1 , FALSEes 0 , por lo que CASEes redundante aquí.

Shlomi Noach
fuente
Muy ordenado y conciso, pero ¿qué sucede cuando los recuentos no caben en un TINYINT? ¿Se produce un error o se produce algún tipo de conversión de tipo?
Jack dice que intente topanswers.xyz
No hay TINYINTen esta historia. SUMtoma cualquier tipo de número que sea (incluso flotante) y produce un resultado numérico. Puede SUMcolumnas de TINYINTtipo para obtener valores en miles, eso no es un problema.
Shlomi Noach
¿Por supuesto que sabe que bool es sinónimo de tinyint por cierto?
Jack dice que intente topanswers.xyz
Sí, amigo mío, lo sé. El "No hay nada TINYINTen esta historia" quizás no fue una buena oración para comenzar.
Shlomi Noach
1
Una nota para cualquiera que tropiece aquí en busca de una respuesta específica de MS SQL Server, la SUMfunción como se menciona aquí no funciona de la misma manera en MS SQL Server. En Transct-SQL solo SUMse puede usar con columnas numéricas.
user1451111
-1

Si respondo bien a su necesidad, quizás esto sea suficiente:

SELECT SUM(CASE 
  WHEN col1 LIKE '%something' THEN 1 
  WHEN col1 LIKE '%another%' THEN 1 
END) AS result
FROM table1;
JohnP
fuente
1
Mirando la respuesta de Aarons, eso es probablemente lo que buscas, para obtener múltiples cuentas, no la suma de todas las cuentas.
JohnP