Como fazer várias contagens em uma consulta?

11

Conto registros com 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 contagem, o mysql precisa percorrer a tabela, e esse é um grande problema se houver uma tabela longa e inúmeras consultas.

Gostaria de saber se existe uma maneira de fazer todas as contagens em uma consulta. Nesse caso, quando o mysql percorrer cada linha, ele processará todas as contagens e não será necessário varrer a tabela inteira repetidamente.

Googlebot
fonte
Para adicionar às respostas corretas, as consultas sugeridas varrem a tabela apenas uma vez.

Respostas:

20

Para obter uma contagem para cada um deles, você pode tentar

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.
fonte
16

Semelhante à solução de Aaron, sintaxe mais curta:

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

A expressão LIKE cria um resultado booleano. TRUEé 1 , FALSEé 0 , então CASEé redundante aqui.

Shlomi Noach
fonte
Muito limpo e conciso - mas o que acontece quando as contagens não se encaixam em um TINYINT - você recebe um erro ou ocorre algum tipo de conversão de tipo?
Jack diz que tente topanswers.xyz 25/08/12
Não há TINYINTnesta história. SUMpega qualquer tipo de número (float par) e produz um resultado numérico. Você pode SUMcolunas do TINYINTtipo para obter valores aos milhares - isso não é um problema.
Shlomi Noach
Você certamente sabe que bool é sinônimo de tinyint btw?
Jack diz que tente topanswers.xyz 25/08/12
Sim, meu amigo, eu sei disso. O "Não existe TINYINTnesta história" talvez não fosse uma boa frase para começar.
Shlomi Noach
11
Uma observação para quem se deparar aqui em busca de uma resposta específica do MS SQL Server, a SUMfunção mencionada aqui não funciona da mesma maneira no MS SQL Server. No Transct-SQL SUMpode ser usado apenas com colunas numéricas.
user1451111
-1

Se eu acertar sua necessidade, talvez isso funcione:

SELECT SUM(CASE 
  WHEN col1 LIKE '%something' THEN 1 
  WHEN col1 LIKE '%another%' THEN 1 
END) AS result
FROM table1;
JohnP
fonte
11
Olhando para a resposta de Aarons que provavelmente é o que você procura - para obter várias contagens - não a soma de todas as contagens.
JohnP