У меня есть таблица тегов, и я хочу получить наибольшее количество тегов из списка.
Пример данных выглядит так
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
и я продолжаю получать "Недопустимое использование групповой функции - ErrNr 1111"
Что я делаю не так?
Я использую MySQL 4.1.25-Debian






MySQL до версии 5 не допускал агрегатных функций в предложениях ORDER BY.
Вы можете обойти это ограничение с помощью устаревшего синтаксиса:
SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY 1 DESC
LIMIT 20
1, поскольку это первый столбец, по которому вы хотите сгруппировать.
Я не знаю насчет 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
В 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
You can get around this limit with the deprecated syntax: ORDER BY 1 DESC
Этот синтаксис вообще не является устаревшим, это E121-03 из SQL99.
Это должен быть комментарий, а не ответ.
Во всех версиях MySQL просто укажите псевдоним агрегата в списке SELECT и отсортируйте его по псевдониму:
SELECT COUNT(id) AS theCount, `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY theCount DESC
LIMIT 20
ИМХО, это более чистая версия, чем выбранный ответ. Сразу понятно, что заказано. Конечно, если это быстрый сценарий, это не имеет значения.
Хотя OP использует MySQL, этот ответ также работал у меня в HSQL (встроенный Libreoffice)
Попробуйте этот запрос
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
При чем здесь вопрос? Поля даже не те.
Кажется, у меня работает в 10.1.14-MariaDB (совместимый с MySQL). Я думал, что мне нужен
) as counts, но он все равно работал без частиas.