정렬 기준이있는 SQL 그룹화 기준


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
IMHO, 이것은 선택한 답변보다 깨끗한 버전입니다. 주문한 내용이 즉시 명확 해집니다. 물론 빠른 스크립트라면 그다지 중요하지 않습니다.
JustAPoring

1
OP는 MySQL을 사용하고 있지만이 답변은 HSQL (Libreoffice 내장)에서도 저에게 효과적이었습니다.
Arno Teigseth

53

버전 5 이전의 MySQL은 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 by작업하기가 더 쉬운 경향이 있기 때문에 s로 카운트를 할 때 전에 이것을했습니다.

그래서

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부품 없이도 여전히 작동했습니다 .
Harry Pehkonen

3

더 이상 사용되지 않는 구문으로이 제한을 피할 수 있습니다. ORDER BY 1 DESC

이 구문은 더 이상 사용되지 않으며 SQL99의 E121-03입니다.


5
이것은 답변이 아닌 주석이어야합니다.
Rafael Barros 2014

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 세븐
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.