2008-08-26 3 views
89

У меня есть таблица тегов и вы хотите получить наивысшие отметки из списка.SQL Group По заказу

Образец данных выглядит следующим образом

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

использованием

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

получает меня данные, я ищу отлично. Тем не менее, я хотел бы организовать его, так что наивысшие метки будут первыми и ограничат его отправкой мне только первые 20 или около того.

Я попытался это ...

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

и я постоянно получаю "Invalid использование функции группы - ErrNr 1111"

Что я делаю неправильно?

Я использую MySQL 4.1.25-Debian

+0

Да, абсолютно. Готово. – maxsilver

ответ

164

Во всех версиях MySQL, просто псевдоним агрегата в списке выбора и заказа по псевдониму:

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

IMHO, это более чистая версия, чем выбранный ответ. Это сразу понятно, что упорядочено. Конечно, если это быстрый сценарий, это не имеет большого значения. – JustAPoring

+1

Хотя OP использует MySQL, этот ответ также работал для меня в HSQL (встроенный Libreoffice) –

48

MySQL до версии 5 не позволяют агрегатные функции в ORDER BY пунктах.

Вы можете обойти это ограничение с уходящим синтаксисом:

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

1, так как это первая колонка вы хотите сгруппировать по.

7

Я не знаю о MySQL, но в MS SQL вы можете использовать индекс столбца в предложении order by. Я делал это раньше, когда делаю счет с group by, так как с ним легче работать.

Так

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

Становится

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

В Oracle, что-то вроде этого хорошо работает, чтобы отделить подсчетом и заказать немного лучше. Я не уверен, если он будет работать в MySql 4.

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

Кажется работать для меня в 10.1.14-MariaDB (совместимо с MySQL). Я думал, что должен иметь ') как счетчик', но он все еще работал без части« как ». –

2

Вы можете обойти это ограничение с уходящим синтаксисом: ORDER BY 1 DESC

Этот синтаксис не устаревшей в все это E121-03 из SQL99.

+4

Это должен быть комментарий вместо ответа. –

+7

Вы не должны комментировать почти шестилетний ответ :-) –

+3

Kkkk, справедливо. –

0

Попробуйте этот запрос

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 
+0

Что это касается вопроса? Поля не совпадают. –