개발후라이
개발후라이
개발후라이
  • 분류 전체보기 (287)
    • Web Front End (76)
      • Javascript & Typescript (26)
      • React (12)
      • Vue (4)
      • Nodejs (1)
      • HTML (6)
      • CSS (8)
      • HTTP (6)
      • 책 - Review (8)
    • TIL (0)
    • Problem Solved (135)
      • 알고리즘 (4)
      • BOJ (67)
      • Programmers (8)
      • HackerRank (33)
      • LeetCode (23)
    • 회고 (4)
      • 오늘의 회고 (16)
      • 주간 회고 (15)
      • 월간 회고 (7)
      • WakaTime (9)
    • Git (3)
    • 기타 (15)
      • 취업 (5)
      • 자격증 (1)

블로그 메뉴

  • GitHub
  • LinkedIn
  • 홈

인기 글

태그

  • 프론트엔드
  • 릿코드
  • TypeScript
  • 개발자
  • 자바스크립트
  • 노개북
  • 회고
  • 노마드북클럽
  • JavaScript
  • 오늘의회고

최근 댓글

최근 글

전체 방문자
오늘
어제

티스토리

hELLO · Designed By 정상우.
개발후라이
Problem Solved/HackerRank

[HackerRank][MySQL] Advanced Join Interview

[HackerRank][MySQL] Advanced Join Interview
Problem Solved/HackerRank

[HackerRank][MySQL] Advanced Join Interview

2019. 10. 29. 20:13
반응형

문제

 

문제 설명

테이블: Contests, Colleges, Challenges, View_Stats, Submission_stats

조건: contest_id, hacker_id, name, total_submissions의 합, total_accepted_submissions의 합, total_views의 합, total_unique_views의 합을 출력해야 한다.

contest_id를 기준으로 정렬한다.

4개의 합계 모두 0일 경우 출력 결과에서 제외된다.

참고: 1Contest - N Colleges, 1 College - 1 Contest

 

문제 풀이

Join: Contents - Colleges, Colleges - Challenges,

left join: Challenges - View_Stats, View_Stats - Submission_Stats

여기서 left join은 왼쪽 테이블의 모든 레코드와 오른쪽 테이블이 일치된 레코드를 반환하게 하는 조인이다.

오른쪽 테이블에 왼쪽 테이블과 일치하는 항목이 없더라도 왼쪽 테이블의 모든 레코드를 반환한다. 일치하는 항목이 없으면 NULL이 입력된다.

(참고: https://www.w3schools.com/sql/sql_join_left.asp)

left join을 쓰는 이유는 값을 빼먹지 않기 위해서다.

그냥 조인을 쓰면 결과가 아래와 같이 나온다.

이건 left 조인 사용했을 때의 결과다. 비슷해 보이지만 sum 값들을 비교해 보면 값이 빠져서 합쳐진걸 볼 수 있다. 

left join을 사용하는 이유는 테이블을 연결시킬 때 놓치는 값이 없게 하기 위해서인 것 같다.

답 (MySQL)

 

select contests.contest_id,
contests.hacker_id,
contests.name,
sum(total_submissions),
sum(total_accepted_submissions),
sum(total_views),
sum(total_unique_views)
from contests
join colleges on contests.contest_id = colleges.contest_id
join challenges on colleges.college_id = challenges.college_id
left join (select challenge_id,
sum(total_views) as total_views,
sum(total_unique_views) as total_unique_views
from view_stats
group by challenge_id) vs
on challenges.challenge_id = vs.challenge_id
left join (select challenge_id,
sum(total_submissions) as total_submissions,
sum(total_accepted_submissions) as total_accepted_submissions
from submission_stats group by challenge_id) ss
on challenges.challenge_id = ss.challenge_id
group by contests.contest_id, contests.hacker_id, contests.name
having sum(total_submissions)!=0 or
sum(total_accepted_submissions)!=0 or
sum(total_views)!=0 or
sum(total_unique_views)!=0
order by contest_id;
view raw advanced-join.sql hosted with ❤ by GitHub

 

반응형
    'Problem Solved/HackerRank' 카테고리의 다른 글
    • [HackerRank] Day 3: Conquer Conditionals (조건문)
    • [HackerRank][Java] Day 2: Operators(연산자)
    • [HackerRank][Java] Day 1: Data Types
    • [HackerRank] Day 0: Hello, World.
    개발후라이
    개발후라이
    어제보다 오늘 발전하기 위한 공간 https://github.com/choisohyun

    티스토리툴바

    개인정보

    • 티스토리 홈
    • 포럼
    • 로그인

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.