SQL Group By с порядком по


122

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

Пример данных выглядит так

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

Ответы:


199

Во всех версиях MySQL просто укажите псевдоним агрегата в списке SELECT и отсортируйте его по псевдониму:

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

9
ИМХО, это более чистая версия, чем выбранный ответ. Сразу понятно, что заказано. Конечно, если это быстрый сценарий, это не имеет значения.
JustAPoring 04

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

53

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

Вы можете обойти это ограничение с помощью устаревшего синтаксиса:

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

1, поскольку это первый столбец, по которому вы хотите сгруппировать.


8

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

Так

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

6

В 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

Кажется, работает для меня в 10.1.14-MariaDB (совместимом с MySQL). Я думал, что надо ) as counts, но все равно работало без asдетали.
Гарри Пехконен,

3

Вы можете обойти это ограничение с помощью устаревшего синтаксиса: ORDER BY 1 DESC

Этот синтаксис вообще не является устаревшим, это E121-03 из SQL99.


5
Это должен быть комментарий, а не ответ.
Рафаэль Баррос

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

При чем тут вопрос? Поля даже не те.
Blakes Seven
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.