2010-07-15 2 views
4

가장 많이 발생하는 값을 선택하는 방법을 찾고 있습니다. 각 스레드별로 가장 많이 게시 한 사람.MySQL에서 가장 많이 발생하는 값을 선택하십시오.

SELECT MOST_OCCURRING(user_id) FROM thread_posts GROUP BY thread_id 

이렇게하는 좋은 방법이 있습니까?

+0

상관 상위 게시 사용자가있는 스레드 당 하나의 행 목록이 필요합니까? –

+0

@Michael, 맞습니다. – Aistina

답변

8

스레드 단위로 계산을 원한다면 중첩 된 쿼리를 사용할 수 있다고 생각합니다. 스레드별로 그룹화 한 다음 사용자별로 그룹화 :

SELECT thread_id AS tid, 
    (SELECT user_id FROM thread_posts 
     WHERE thread_id = tid 
     GROUP BY user_id 
     ORDER BY COUNT(*) DESC 
     LIMIT 0,1) AS topUser 
FROM thread_posts 
GROUP BY thread_id 
+0

+1, 귀하의 의견을 참조하십시오 – Unreason

2

"그룹당 가장 큰 n"태그 아래의 질문을 확인하는 경우 수많은 예제가 있습니다. 하지만이 경우에는 묶음을 처리 할 방법을 정의하지 않습니다. 두 명 이상의 사용자가 동일한 계수 값을 갖는 경우는 어떻게됩니까?

SELECT DISTINCT 
     tp.thread_id, 
     tp.user_id 
    FROM THREAD_POSTS tp 
    JOIN (SELECT t.thread_id, 
       t.user_id, 
       COUNT(t.user_id) AS occurrence, 
       CASE 
       WHEN @thread != t.thread_id THEN @rownum := 1 
       ELSE @rownum := @rownum + 1 
       END AS rank, 
       @thread := t.thread_id 
      FROM THREAD_POSTS t 
      JOIN (SELECT @rownum := 0, @thread := -1) r 
     GROUP BY t.thread_id, t.user_id 
     ORDER BY t.thread_id, occurrence DESC) x ON x.thread_id = tp.thread_id 
               AND x.user_id = tp.user_id 
               AND x.rank = 1 
3

이 스레드

SELECT thread_id, user_id, COUNT(*) as postings 
FROM thread_posts 
GROUP BY thread_id, user_id 

당 USER_ID의 발생을 표로 것입니다하지만 당신은 단지

SELECT thread_id, user_id, COUNT(*) as postings 
FROM thread_posts 
GROUP BY thread_id, user_id 
HAVING postings = max(postings) 
에 해당 각 스레드

SELECT thread_id, user_id, postings 
FROM (
    SELECT thread_id, user_id, COUNT(*) as postings 
    FROM thread_posts 
    GROUP BY thread_id, user_id 
) 
HAVING postings = max(postings) 

의 최고 사용자를 선택하려면

HAVING 키 워드 d는 HAVING 절의 조건을 만족하는 집계 된 출력 행을 체리 선택하기 위해 집계 연산과 함께 사용됩니다.

HAVING 절은 WHERE 절과 다른데, HAVING 절은 쿼리의 결과 출력을 필터링합니다. 반면 WHERE 절은 쿼리의 입력 데이터를 필터링합니다. HAVING 절은 쿼리의 결과 출력을 필터링하므로 ORDER BY 및 GROUP BY 절 다음에 나타나야합니다.

+2

작동하지 않습니다. 이 쿼리를 실행하면 빈 출력이 나타납니다. mysql에서 아무 것도 반환되지 않습니다. –

관련 문제