출처
문제
the minimum number of gold galleons needed to buy each non-evil wand of high power and age.
문제에 대한 해석
조건1. non_evil wand (값이 0인것)
조건2. age와 power가 각각 같은 것들중에 coin_needed가 가장 작은 것
? code, age 간의 매핑은 1:1 관계
풀이(MYSQL)
select w.id, wp.age, w.coins_needed, w.power
from Wands w join Wands_Property wp
on w.code = wp.code
where wp.is_evil = 0
and w.coins_needed
= (select min(w2.coins_needed)
from Wands w2 join Wands_Property wp2
on w2.code = wp2.code
where wp2.is_evil = 0
and wp2.age = wp.age
and w.power = w2.power)
order by w.power desc, age desc
작동순서
💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환
- FROM 절: Wands와 Wands_Property를 조인하여
- WHERE 절: is_evil 이 0으로 악한 힘이 없는 조건과 하단 서브쿼리의 결과와 coins_needed가 같은 경우 필터링 하여
- Wands와 Wands_Property를 새롭게 조인한 테이블에서
- is_evil 이 0으로 악한 힘이 없는 조건으로 필터링 한 후
- 새롭게 조인한 테이블에서 age와 기존 테이블의 age가 같고
- 새롭게 조인한 테이블에서 power와 기존 테이블의 power가 같은 경우
- coins_needed의 최솟값을 조회하라
- SELECT 절: id, age, coins_needed, power을 조회하라
- ORDER BY 절: power 내림차순, age 내림차순
정답 | age = 496, power = 10인 경우의 coin |
age = 496, power = 10인 경우의 coin은 2개 존재 > 이중 가장 작은 것을 조회 하는 조건 |
다른사람 풀이
wp.is_evil = 0조건을 메인쿼리 / 서브쿼리 / 메인+ 서비 쿼리에 주어도 모두 정답
배운점
wp.is_evil = 0조건을 어디에 추가해야 하는가?
1. 서브쿼이에만 조건이 있을 경우
: 정답, age와power가 같고 evil=0이최소화 하는 coin을 선행으로 찾은뒤
메인쿼리에서 해당 coin과 같은 지팡이 조회
2. 메인 쿼리에만 있을 경우
:
age와power가 같은 경우 최소화 하는 coin조회
> 이떄 coin 의 최솟값이 is_evil = 1일경우 (예 : age = 1, coin=1, power=1 evil =1 과 age = 1, coin=2, power=1 evil =0 일경우 메인쿼리에서는 age = 1, coin=1, power=1 evil =1 만 출력)
> 이후 evil=0 이라는 조건을 주면 age = 1, power=1 인 지팡이는 조회되지 않음
> 그러나 서브쿼리에 evil=0 조건이 있는 경우는 age = 1, coin=2, power=1 로 age = 1, power=1 인 지팡이가 조회됨
즉, 서브쿼리에 있을때와 메인쿼리에만 있을때 결과값이 다름
그러나 문제에서는 동일 age = 1, power=1가 없어도 되는 것
왜? age와power가 같은 경우 최소화 하는 coin이 evil이 1인 경우의 age와power는 evil이 0인 경우가 없다
age와power가 같은 경우 최소화 하는 coin이 evil이 1인 경우 | 옆의 age,pwer가 같은 경우 evil이 0인 경우 |
select wp.age,w.coins_needed, w.power, wp.is_evil from Wands w join Wands_Property wp on w.code = wp.code where wp.age in (156, 153, 150, 146, 135, 130, 127,123,116,113,107) and w.power = 9 and wp.is_evil = 0 order by age desc 없음! |
with tmp as (
select wp.age, w.power
from Wands w join Wands_Property wp
on w.code = wp.code
where w.coins_needed
= (select min(w2.coins_needed)
from Wands w2 join Wands_Property wp2
on w2.code = wp2.code
where wp2.age = wp.age
and w.power = w2.power)
and wp.is_evil = 1
order by w.power desc, age desc) -- age, power의 값이 각각 같다면 coins_needed 값을 최소로 하는 지팡이 중 evil=1인 경우
select wp.age, w.power, wp.is_evil
from Wands w join Wands_Property wp
on w.code = wp.code
join tmp t
on wp.age = t.age and w.power = t.power
'문제풀이 > SQL(My sql)' 카테고리의 다른 글
[문제풀이] Hacker Rank - SQL Project Planning (0) | 2024.06.14 |
---|---|
[문제풀이] Hacker Rank - Contest Leaderboard (0) | 2024.06.13 |
[문제풀이] Programmers - 업그레이드 된 아이템 구하기 (1) | 2024.06.11 |
[문제풀이] Hacker Rank - Top Competitors (0) | 2024.06.11 |
[문제풀이] Hacker Rank - THE REPORT (0) | 2024.06.11 |