SQL Group By z Order By

122

Mam tabelę tagów i chcę uzyskać największą liczbę tagów z listy.

Przykładowe dane wyglądają następująco

id (1) tag ('night')
id (2) tag ('awesome')
id (3) tag ('night')

za pomocą

SELECT COUNT(*), `Tag` from `images-tags`
GROUP BY `Tag`

odzyskuje dane, których szukam doskonale. Chciałbym jednak to zorganizować tak, aby najwyższe liczby tagów były pierwsze i ograniczyć je do wysyłania tylko pierwszych 20 lub więcej.

Próbowałem tego ...

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

i ciągle otrzymuję komunikat „Nieprawidłowe użycie funkcji grupy - ErrNr 1111”

Co ja robię źle?

Używam MySQL 4.1.25-Debian

maxsilver
źródło

Odpowiedzi:

199

We wszystkich wersjach MySQL po prostu ustaw alias agregatu na liście SELECT i uporządkuj według aliasu:

SELECT COUNT(id) AS theCount, `Tag` from `images-tags`
GROUP BY `Tag`
ORDER BY theCount DESC
LIMIT 20
Scott Noyes
źródło
9
IMHO, to jest czystsza wersja niż wybrana odpowiedź. Od razu wiadomo, co zamawia. Oczywiście, jeśli to szybki scenariusz, to nie ma znaczenia.
JustAPoring
1
Chociaż OP używa MySQL, ta odpowiedź zadziałała również dla mnie w HSQL (wbudowany Libreoffice)
Arno Teigseth
53

MySQL przed wersją 5 nie zezwalał na funkcje agregujące w klauzulach ORDER BY.

Możesz obejść ten limit za pomocą przestarzałej składni:

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

1, ponieważ jest to pierwsza kolumna, według której chcesz się zgrupować.

Lasse V. Karlsen
źródło
8

Nie wiem o MySQL, ale w MS SQL możesz użyć indeksu kolumny w order byklauzuli. Robiłem to już wcześniej, gdy liczyłem z group bys, ponieważ jest to łatwiejsze w użyciu.

Więc

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

Staje się

SELECT COUNT(id), `Tag` from `images-tags`
GROUP BY `Tag`
ORDER 1 DESC
LIMIT 20
jerhinesmith
źródło
6

W Oracle coś takiego działa ładnie, aby trochę lepiej oddzielić liczenie od zamawiania. Nie jestem pewien, czy zadziała w MySql 4.

select 'Tag', counts.cnt
from
  (
  select count(*) as cnt, 'Tag'
  from 'images-tags'
  group by 'tag'
  ) counts
order by counts.cnt desc
JosephStyons
źródło
Wydaje się, że działa dla mnie w 10.1.14-MariaDB (kompatybilny z MySQL). Myślałem, że muszę to mieć ) as counts, ale i tak działało bez tej asczęści.
Harry Pehkonen
3

Możesz obejść ten limit za pomocą przestarzałej składni: ORDER BY 1 DESC

Ta składnia nie jest w ogóle przestarzała, to E121-03 z SQL99.

Damien B
źródło
5
Powinien to być komentarz zamiast odpowiedzi.
Rafael Barros
0

Spróbuj tego zapytania

 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
Ashutosh Gupta
źródło
Co to ma wspólnego z pytaniem? Pola nie są nawet takie same.
Blakes Seven