SQL Group By с упорядочением по

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

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

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

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
133
0
584 300
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

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

Harry Pehkonen 24.08.2017 17:08

You can get around this limit with the deprecated syntax: ORDER BY 1 DESC

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

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

Rafael Barros 24.04.2014 22:53
Ответ принят как подходящий

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

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

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

JustAPoring 04.02.2013 19:26

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

Arno Teigseth 17.11.2015 05:39

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

 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 13.07.2015 13:10

Другие вопросы по теме