SQL agrupar por com um pedido por
-
09-06-2019 - |
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
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 by
s, 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