SQL Group By с заказом By - PullRequest
       18

SQL Group By с заказом By

107 голосов
/ 26 августа 2008

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

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

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

Ответы [ 6 ]

181 голосов
/ 27 августа 2008

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

SELECT COUNT(id) AS theCount, `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY theCount DESC
LIMIT 20
51 голосов
/ 26 августа 2008

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

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

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

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

7 голосов
/ 26 августа 2008

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

So

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 голосов
/ 26 августа 2008

В 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
2 голосов
/ 26 августа 2008

Вы можете обойти это ограничение с помощью устаревшего синтаксиса: ЗАКАЗАТЬ НА 1 DESC

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

0 голосов
/ 13 июля 2015

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

 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
...