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

1
Хоча OP використовує MySQL, ця відповідь також працювала для мене в HSQL (вбудований Libreoffice)
Arno Teigseth

53

MySQL до версії 5 не дозволяв агрегувати функції в замовленні ЗАМОВЛЕННЯ.

Ви можете обійти цю межу за допомогою застарілого синтаксису:

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

Ви можете подолати цю межу за допомогою застарілого синтаксису: ЗАМОВИТИ НА 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

Що це стосується питання? Поля навіть не однакові.
Блейкс Сім
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.