Pergunta

Eu tenho uma tabela de tags e quero obter as tags de maior contagem da lista.

Os dados de amostra são assim

id (1) tag ('night')
id (2) tag ('awesome')
id (3) tag ('night')

usando

SELECT COUNT(*), `Tag` from `images-tags`
GROUP BY `Tag`

me devolve os dados que procuro perfeitamente.No entanto, gostaria de organizá-lo para que as contagens de tags mais altas sejam as primeiras e limitá-lo a me enviar apenas as primeiras 20 ou mais.

Eu tentei isso...

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY COUNT(id) DESC
LIMIT 20

e continuo recebendo a mensagem "Uso inválido da função de grupo - ErrNr 1111"

O que estou fazendo de errado?

Estou usando MySQL 4.1.25-Debian

Foi útil?

Solução

Em todas as versões do MySQL, simplesmente crie um alias para o agregado na lista SELECT e ordene pelo alias:

SELECT COUNT(id) AS theCount, `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY theCount DESC
LIMIT 20

Outras dicas

O MySQL anterior à versão 5 não permitia funções agregadas em cláusulas ORDER BY.

Você pode contornar esse limite com a sintaxe obsoleta:

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY 1 DESC
LIMIT 20

1, já que é a primeira coluna que você deseja agrupar.

Não sei sobre MySQL, mas no MS SQL você pode usar o índice da coluna no order by cláusula.Já fiz isso antes ao fazer contas com group bys, pois tende a ser mais fácil de trabalhar.

Então

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY COUNT(id) DESC
LIMIT 20

Torna-se

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER 1 DESC
LIMIT 20

No Oracle, algo assim funciona muito bem para separar um pouco melhor a contagem e a ordem.Não tenho certeza se funcionará no MySql 4.

select 'Tag', counts.cnt
from
  (
  select count(*) as cnt, 'Tag'
  from 'images-tags'
  group by 'tag'
  ) counts
order by counts.cnt desc

Você pode contornar esse limite com a sintaxe obsoleta:ENCOMENDE POR 1 DESC

Esta sintaxe não está obsoleta, é E121-03 do SQL99.

Tente esta consulta

 SELECT  data_collector_id , count (data_collector_id ) as frequency 
    from rent_flats 
    where is_contact_person_landlord = 'True' 
    GROUP BY data_collector_id 
    ORDER BY count(data_collector_id) DESC
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top