2012-11-18 2 views
2

저는 SQL을 처음 사용하고 있으며 배우려고합니다. 나에게 일어난 문제는 테이블에있는 사람의 최대 발생 횟수를 찾는 방법이었습니다. 쿼리가 각 ID를 다른 ID와 어떻게 비교하고 카운트를 추적하는지 확신 할 수 없습니다. 설명이 불분명하지만 여기서 더 명확하게 이해할 수있는 데이터 세트가 있습니다.가장 자주 방문하는 사람 찾기

players: 
+--------+--------+ 
| pid | name | 
+--------+--------+ 
| 1  | Tom | 
| 2  | Sam | 
| 3  | Dan | 
+--------+--------+ 

scores: 
+--------+--------+--------+ 
| sid | pid | result | 
+--------+--------+--------+ 
| 1  | 1  | miss | 
| 2  | 1  | hit | 
| 3  | 3  | hit | 
| 4  | 2  | miss | 
| 5  | 3  | hit | 
| 6  | 3  | hit | 
+--------+--------+--------+ 

예상 답변은 pid = 3, name = Dan입니다. 왜냐하면 그는 다른 모든 선수들 중에서 가장 많은 히트를 기록했기 때문입니다.

답변

2
Select 
    p.pid, 
    p.name 
From (
    Select 
    p.pid, 
    p.name, 
    count(*) 
    From 
    players p 
     inner join 
    scores s On 
     p.pid = s.pid 
    Where 
    result = 'hit' 
    Group By 
    p.pid, 
    p.name 
    Order By 
    count(*) Desc 
) p 
Where 
    rownum = 1; 

http://sqlfiddle.com/#!4/03ba0/22

+0

sqlfiddle은 1의 결과를 제공합니다. 3, Dan이어야합니다. – user1834372

+0

@ user1834372 죄송합니다. 오라클이 주문 전에 rownum을 적용한다는 사실을 잊어 버렸습니다. – Laurence

1

이 시도 : SQLFiddle Demo

select pid, hits from(
    Select p.pid, count(*) as hits FROM players p 
    JOIN scores s 
     ON p.pid = s.pid AND s.result = 'hit' 
    GROUP BY p.pid 
    ORDER By count(*) DESC 
) 
Where rownum <= 1 
+0

감사합니다. 이제 조인에 대해 배우게 될 것입니다. – user1834372

0

이 또한 해결책이 될 수 있습니다 :

그들은 모두있는 경우이 두 개 이상의 플레이어가 반환
select 
    players.pid, 
    players.name 
from 
    scores inner join players 
    on scores.pid = players.pid 
    and scores.result = 'hit' 
group by players.pid, players.name 
having count(*)=(select max(cnt) 
       from 
        (select pid, count(*) as cnt 
        from scores 
        where result='hit' 
        group by pid) t) 

공지 사항 조회수와 동일한 수입니다. 또한 플레이어가 점수 테이블에 있지만 플레이어 테이블에는없는 경우에는 표시되지 않습니다.

관련 문제