DISTINCT 값의 발생 수 계산


218

특정 필드에서 DISTINCT 값을 찾고 해당 값의 발생 횟수를 계산 한 다음 결과를 계산하여 정렬하는 MySQL 쿼리를 찾으려고합니다.

예제 db

id         name
-----      ------
1          Mark
2          Mike
3          Paul
4          Mike
5          Mike
6          John
7          Mark

예상 결과

name       count
-----      -----
Mike       3
Mark       2
Paul       1
John       1

답변:


396
SELECT name,COUNT(*) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;

2
여기서 그룹이 정확히 무엇입니까? 목적이 무엇인지 확실하지 않습니까? 그냥 읽기만하면됩니다.
제임스

19
앰버의 질문은 그 질문에 대한 정답이지만 새로운 사람들이 길을 잃지 않도록 그녀의 의견을 수정하고 싶습니다. MySQL 쿼리에서 "group by"를 생략하면 [Mike, 1], [Mike, 1]이 표시되지 않고 FIRST 행의 이름이 반환되는 단일 결과와 개수가 표시됩니다. 이 경우 [Mark, 7]과 같이 테이블에있는 행 수입니다. 집계 함수가 count () 인 경우 전체 데이터 세트에서 작업을 수행하여 지정된 필드를 한 행으로 합산, 계산 또는 연결합니다. 그룹화는 지정된 필드의 고유 한 콤보를 기반으로 데이터 집합을 청크로
나눕니다.

3
내가 고생 한 것은 중복없이 결과를 제거하는 것이 었습니다. 당신은을 던질 수 없습니다 count(*) > 1where는 집계 기능을 때문에 절. 또한 "그룹 기능을 잘못 사용했습니다."라는 매우 유용한 메시지가 나타납니다. 올바른 방법은 카운트 별명을 지정하고 다음 name,COUNT(*) as cnt과 같이 having 절을 추가하는 것 HAVING count > 1입니다.
Patrick M

4
@PatrickM 예, HAVING집계 후 WHERE적용해야하는 조건에 대한 것이지만 이전에 적용해야하는 조건에 대한 것입니다. (이를 생각하는 또 다른 방법은 WHERE원본 행 데이터에 HAVING적용되고 출력 행 데이터에 적용되는 것입니다.)
Amber

2
잘 구성된 SQL 문에 대해 매우 만족스러운 점이 있습니다.
Joshua Pinter

14

이 같은 것은 어떻습니까 :

SELECT
  name,
  count(*) AS num
FROM
  your_table
GROUP BY
  name
ORDER BY
  count(*)
  DESC

이름과 표시 횟수를 선택하고 있지만 이름별로 그룹화하므로 각 이름은 한 번만 선택됩니다.

마지막으로, 가장 자주 나타나는 사용자가 먼저 오도록 DESCending 순서로 여러 번 주문합니다.


귀하의 질문이 도움이되었습니다. 결과적으로 몇 개의 행을 반환합니다. 또한이 결과의 수를 찾는 방법을 알고 싶었습니다. 몇 가지 쿼리를 시도했지만 집계를 계산할 수없는 것 같습니다. 도움이 될 수 있습니까?
Nav

@Nav-무엇의 수? 반환 된 행 수? 그것은 SELECT COUNT(DISTINCT name) as count FROM your_table테이블의 총 행 수를 계산하기 위해 group by문장 없이 Pascal의 쿼리를 수행 합니다.
Autumn Leonard

분이 얼마나 큰 차이가 있나!
Chuck Le Butt

6

더 나은 성능을 위해 Amber의 COUNT (*)를 COUNT (1)로 변경했습니다.

SELECT name, COUNT(1) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;

1
실제로 당신이 말한 것은 여기
James
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.