[mysql] 정렬 기준이있는 SQL 그룹화 기준

태그 테이블이 있고 목록에서 가장 많은 수의 태그를 얻고 싶습니다.

샘플 데이터는 다음과 같습니다.

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을 사용하고 있습니다.



답변

모든 버전의 MySQL에서 SELECT 목록의 집계에 별칭을 지정하고 별칭별로 정렬하면됩니다.

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


답변

버전 5 이전의 MySQL은 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작업하기가 더 쉬운 경향이 있기 때문에 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


답변

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


답변

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

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


답변

이 쿼리 시도

 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


답변