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.