MySQL 해커랭크 | Placements (자신과 친한 친구의 급여 비교하기)

    728x90

     

    문제

    https://www.hackerrank.com/challenges/placements/problem?isFullScreen=true

     

    Placements | HackerRank

    Write a query to output the names of those students whose best friends got offered a higher salary than them.

    www.hackerrank.com

    • Write a query to output the names of those students whose best friends got offered a higher salary than them
    • Names must be ordered by the salary amount offered to the best friends. 
    • It is guaranteed that no two students got same salary offer.

    # 문제 해석

    • 친한 친구가 자신보다 높은 급여를 받는 경우에 해당하는 학생들의 이름 조회하기
    • 이름은 자신의 친한 친구가 받는 급여 크기로 정렬하기

     

    테이블

    Students 테이블 Friends 테이블 Packages 테이블

     

    풀이과정

    # 가상테이블 fs 생성

    • 세 테이블을 ID를 기준으로 INNER JOIN함
      • FROM절에 조인할 테이블을 모두 넣고, WHERE절에 조건을 넣어주면 INNER JOIN됨
    • ID와 이름, 급여, 친한 친구ID까지 SELECT문에 조회해줌
      • 나중에 친한 친구ID에 해당하는 친구의 급여를 Packages 테이블에서 한 번 더 조인해줄 것이기 때문
    1
    2
    3
    4
    5
    6
    WITH fs AS(
               SELECT s.ID, s.Name, p.Salary, f.Friend_ID  
               FROM Students s, Friends f, Packages p 
               WHERE s.ID = f.ID AND f.ID = p.ID 
               )
    SELECT * FROM fs
    cs

     

    # 내 ID, 내 이름, 내 급여 | 친구 ID, 친구 급여 

    • 내 급여와 친구 급여를 한 눈에 볼 수 있게 한 번 다같이 조회해봄
    1
    2
    3
    4
    5
    6
    7
    WITH fs AS(
               SELECT s.ID, s.Name, p.Salary, f.Friend_ID  
               FROM Students s, Friends f, Packages p 
               WHERE s.ID = f.ID AND f.ID = p.ID 
               )
    SELECT fs.*, p.Salary FROM fs
    JOIN Packages p ON fs.Friend_ID = p.ID
    cs

     

    # 정답

    • 가상 테이블과 Packages 테이블을 조인해 친한 친구의 급여도 알 수 있게 만듦 
    • WHERE절에서 자신의 급여보다 친한 친한 친구의 급여가 높은 경우를 조건으로 주어 레코드 필터링
    • 급여 기준으로 정렬
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH fs AS(
                SELECT s.ID, s.Name, p.Salary, f.Friend_ID  
                FROM Students s, Friends f, Packages p 
                WHERE s.ID = f.ID AND f.ID = p.ID 
               )
    SELECT fs.Name FROM fs
    JOIN Packages p ON fs.Friend_ID = p.ID 
    WHERE fs.Salary < p.Salary
    ORDER BY p.Salary
    cs

    728x90

    댓글