Contar as ocorrências dos valores DISTINCT


218

Estou tentando encontrar uma consulta MySQL que encontre valores DISTINCT em um campo específico, conte o número de ocorrências desse valor e ordene os resultados pela contagem.

exemplo db

id         name
-----      ------
1          Mark
2          Mike
3          Paul
4          Mike
5          Mike
6          John
7          Mark

resultado esperado

name       count
-----      -----
Mike       3
Mark       2
Paul       1
John       1

Respostas:


395
SELECT name,COUNT(*) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;

2
O que exatamente o grupo está fazendo aqui? Não está claro qual é o propósito? Parece que deve funcionar com isso, se você estiver lendo claramente.
James

19
Embora a pergunta de Amber seja a resposta correta para a pergunta, eu gostaria de fazer uma correção no comentário dela para evitar desviar novas pessoas. Se você deixar o "agrupar por" em uma consulta do MySQL, você não obterá [Mike, 1], [Mike, 1], obterá um único resultado que será o nome na PRIMEIRA linha retornada e uma contagem do número de linhas na tabela, portanto, neste caso [Marcos, 7]. count (), pois uma função agregada funciona em todo o conjunto de dados, somando, contando ou concatenando o campo especificado em uma linha. Agrupar por subdivide o conjunto de dados em partes com base em combinações exclusivas dos campos especificados
Avatar_Squadron

3
Algo que eu lutei foi eliminar os resultados sem duplicatas. Você não pode count(*) > 1inserir uma wherecláusula em uma , porque é uma função agregada. Você também recebe uma mensagem muito inútil: "Uso inválido da função de grupo". O caminho certo é aliás a contagem name,COUNT(*) as cnte adicionar uma cláusula tendo assim: HAVING count > 1.
Patrick M

4
@PatrickM Sim, HAVINGé para condições que devem ser aplicadas após a agregação, enquanto WHEREpara condições que devem ser aplicadas antes dela. (Outra maneira de pensar sobre isso é que WHEREse aplica aos dados da linha original; HAVINGaplica-se aos dados da linha de saída.) #
276 Amber Amber

2
Há algo muito gratificante em uma instrução SQL bem construída.
Joshua Pinter

14

Que tal algo assim:

SELECT
  name,
  count(*) AS num
FROM
  your_table
GROUP BY
  name
ORDER BY
  count(*)
  DESC

Você está selecionando o nome e o número de vezes que aparece, mas agrupando por nome para que cada nome seja selecionado apenas uma vez.

Por fim, você ordena pelo número de vezes em ordem decrescente, para que os usuários que aparecem com mais frequência sejam os primeiros.


Sua consulta me ajudou. Ele retorna algumas linhas como resultado. Eu também queria saber como encontrar a contagem desse resultado. Tentei algumas consultas, mas parece não poder contar com um agregado. Você poderia ajudar com isso?
Nav

@ Nav - uma contagem de quê? O número de linhas retornadas? Isso é SELECT COUNT(DISTINCT name) as count FROM your_tablePara uma contagem do total de linhas da tabela, faça a consulta de Pascal sem a group byinstrução
Autumn Leonard

Que diferença faz um minuto!
Chuck Le Butt

6

Alterou COUNT (*) de Amber para COUNT (1) para obter um melhor desempenho.

SELECT name, COUNT(1) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;

1
Na verdade, o que você disse é parcial aqui #
James
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.