출처
문제
가장 많은 친구와 가장 많은 친구 수를 가진 사람들을 찾는 솔루션을 작성하십시오.
테스트 케이스는 한 사람만 가장 많은 친구를 갖도록 생성됩니다.
문제에 대한 해석
친구가 가장 많은 사람을 뽑는 것으로 각 id에서 가장 많은 id를 추출하면 된다
requester_id별 친구의 개수
|
accepter_id 별 친구의 개수
|
select requester_id, count(*) as 're_num'
from RequestAccepted
group by requester_id
|
select accepter_id, count(*) as 'acc_num'
from RequestAccepted
group by accepter_id
|
문제1.
requester_id에만 아이디가 있거나
accepter_id에만 아이디가 있을 수 있으니 full outer join을 해야한다
단, mysql에는 fiull outer join이 없으니 left,right join을 uion으로 합쳐주면 된다
문제2. ifnull의 사용
각각 left,right조인을 해주었기 때문에 requester_id또는 accepter_id에 값이 없는 경우 num컬럼은 null이된다.
이때 re_num + acc_num 연산중 null 이 있을 경우 null아 반환됨으로 각 컬럼에 null일 경우 0으로 치환해줘야 한다
with re as (
select requester_id, count(*) as 're_num'
from RequestAccepted
group by requester_id
),
acc as (
select accepter_id, count(*) as 'acc_num'
from RequestAccepted
group by accepter_id
)
select re.requester_id as 'id', ifnull(re.re_num,0) + ifnull(acc.acc_num,0) as 'num'
from
re left JOIN acc
on re.requester_id = acc.accepter_id
union
select acc.accepter_id as 'id', ifnull(re.re_num,0) + ifnull(acc.acc_num,0) as 'num'
from
re right JOIN acc
on re.requester_id = acc.accepter_id
order by num desc
limit 1
다른사람 풀이
with base as (
select requester_id as 'id'
from RequestAccepted
union all
select accepter_id as 'id'
from RequestAccepted
)
select id, count(*) as 'num'
from base
group by id
order by num desc
limit 1
각 id에서 가장 많은 id를 추출하는 가장 쉬운 방법인듯..
requester_id와 accepter_id를 같은 컬럼으로 합치고(단, 중복이 제거되지 않도록 union all로 함)
합친 컬럼에 대해 구룹화 하여 수를 집계하였다
'문제풀이 > SQL(My sql)' 카테고리의 다른 글
[문제풀이] Leet code - Customers Who Bought All Products (0) | 2024.07.31 |
---|---|
[문제풀이] Leet code - Exchange Seats (0) | 2024.07.31 |
[문제풀이] Leet code - Average Selling Price (4) | 2024.07.23 |
[문제풀이] Leet code - Monthly Transactions I (1) | 2024.07.23 |
[문제풀이] Leet code - Students and Examinations (0) | 2024.07.22 |