본문 바로가기

DB

SQL 문제풀이 6)

실력이 조금씩 상승하고 있는것을 느낍니다. 난이도 Medium 단계의 문제를 풀었는데 풀이도 보지 않고 얼마 걸리지 않았네요.

 

문제의 요구사항은 다음과 같습니다.

  • code 별, power 별 최소한의 코인이 필요한 데이터를 출력하라
  • non-evil인 wand를 사야하며 id, age, coins_needed, power를 출력하라
  • power를 기준으로 내림차순 정렬하며, 같은 power일경우 age를 기준으로 내림차순 정렬하라

 

Wands 테이블

 

id code coins_needed power
1 4 3688 8
2 3 9365 3
3 3 7187 10
4 3 734 8
5 1 6020 2
6 2 6773 7
7 3 9873 9
8 3 7721 7
9 1 1647 10
10 4 504 5

 

Wands_property 테이블

 

code age is_evil
1 45 0
2 40 0
3 4 1
4 20 0
5 17 0

 

sample Output

 

9 45 1647 10
12 17 9897 10
1 20 3688 8
15 40 6018 7
19 20 7651 6
11 40 7587 5
10 20 504 5
18 40 3312 3
20 17 5689 3
5 45 6020 2
14 40 5408 1

 

풀이)

 

SELECT C.id, D.age, C.coins_needed, C.power FROM (SELECT A.id, A.code, A.coins_needed, A.power FROM Wands
A INNER JOIN (
    SELECT code, min(coins_needed) as min_coins_needed, power FROM Wands
    GROUP BY code, power
) B
WHERE A.coins_needed = B.min_coins_needed AND A.power = B.power AND A.code = B.code) C
INNER JOIN Wands_Property D
ON C.code = D.code
WHERE D.is_evil = 0
ORDER BY C.power DESC, D.age DESC

 

1. code 별, power 별 최소로 코인이 필요한 데이터를 구하기 위해서 그룹핑을 합니다.

2. 최소로 코인이 필요한 데이터의 id를 알아야하기 때문에 원본 테이블과 code 별, power 별 최소로 코인이 필요한 데이터를 구하기위해 그룹핑한 데이터를 조인합니다(셀프조인)

3. age를 구하기 위해 WandsProperty 테이블과 조인 후 문제가 요구하는 is_evil 값이 0인 행들을 구합니다.

4. 마지막으로 power를 기준으로 내림차순 정렬 후 age를 기준으로 내림차순 정렬합니다. 

'DB' 카테고리의 다른 글

Real My SQL - 아키텍처(2)  (0) 2021.06.06
Real My SQL - 아키텍처(1)  (0) 2021.06.06
SQL 문제풀이 5)  (0) 2020.12.19
SQL 문제풀이 4)  (0) 2020.12.18
SQL 문제풀이 3)  (0) 2020.12.17