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.


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`; 

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.


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;

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.