코딩테스트/SQL 코드카타

MySQL 해커랭크 | Ollivander's Inventory (ON과 WHERE 조건절의 차이)

ANNASENA 2024. 8. 26. 08:00
728x90

 

문제

https://www.hackerrank.com/challenges/harry-potter-and-wands/problem?isFullScreen=true

 

Ollivander's Inventory | HackerRank

Help pick out Ron's new wand.

www.hackerrank.com

  • Hermione decides the best way to choose is by determining 
    • the minimum number of gold galleons needed to buy 
    • each non-evil wand of high power and age
      • If the value of is_evil is 0, it means that the wand is not evil.
  • Write a query to print the id, age, coins_needed, and power of the wands that Ron's interested in.
  • sorted in order of descending power.
  • If more than one wand has same power, sort the result in order of descending age.
  • The mapping between code and age is one-one, meaning that if there are two pairs, (code1, age1) and (code2, age2), then code1 ≠ code2 and age1 ≠ age2


# 문제 조건 정리

  • 돈은 최소로
  • 악의는 없어야 함
  • 높은 파워와 연식
  • 파워 내림차순, 연식 내림차순
  • 지팡이 코드와 연식은 1:1 페어 관계
  • 연식이 같고, 파워가 같으면 돈이 최소인 행만 추출

 

테이블

Wands 테이블 Wands_Property 테이블

 

 

풀이과정

# 악의가 없는 가장 싼 지팡이들

1
2
3
4
5
SELECT wp.code, wp.age, w.power, MIN(w.coins_needed) coins_needed
FROM Wands w
JOIN Wands_Property wp ON w.code = wp.code
WHERE wp.is_evil = 0
GROUP BY 123
cs

 

# 정답

  • '악의가 없는 가장 싼 지팡이들' 테이블과 나머지 테이블들을 조인
    • '악의가 없는 가장 싼 지팡이들' 테이블을 따로 만들어서 조인하는 이유
      가장 싼 지팡이를 찾겠다고 WHERE절에 바로 MIN 집계함수를 사용할 수 없었기 때문
    • 조인할 때 사용한 ON조건절을 보면 코드, 파워, 가격이 같은 데이터만 조인을 해서 필요한 데이터만 필터링함
    • 필터링된 데이터 안에서 파워 내림차순, 연식 내림차순 정렬
1
2
3
4
5
6
7
8
9
SELECT w.id, mc.age, mc.coins_needed, w.power
FROM
(SELECT wp.code, wp.age, w.power, MIN(w.coins_needed) coins_needed
FROM Wands w
JOIN Wands_Property wp ON w.code = wp.code
WHERE wp.is_evil = 0
GROUP BY 123) mc
JOIN Wands w ON w.code=mc.code AND mc.power = w.power AND mc.coins_needed = w.coins_needed
ORDER BY w.power DESC, mc.age DESC
cs

 

# 더 알아두기 (ON절과 WHERE절의 차이)

  • ON : 조인 전에 조건 필터링
  • WHERE : 조인 후에 조건 필터링
    • INNER JOIN 시에는 조건을 어디에 적어도 결과물에 차이 없음
    • 하지만 그 외의 조인에서는 조건을 ON에 줬는지 WHERE에 줬는지에 따라 결과물에 차이 있음
      • ON 조건의 경우 → 조인을 할 때 해당 조건 외 나머지 레코드null이 됨
      • WHERE 조건의 경우 → 조인을 다 마친 결과물에 WHERE 조건에 해당되는 레코드만 필터링됨 
  • 위 문제에서는 INNER JOIN을 사용하고 있어서 조건을 ON절에 적든 WHERE절에 적든 결과물에 차이가 없음
    • w.code=wp.code AND wp.is_evil = 0 이렇게 조건을 줄 수도 있음
  • https://velog.io/@crosstar1228/SQL-join%ED%95%A0%EB%95%8C-on-%EA%B3%BC-where%EC%9D%98-%EC%B0%A8%EC%9D%B4
 

[SQL] join할때 on 과 where의 차이

on : join 전에 조건을 필터링 where : join 후에 조건을 필터링inner join 하면 둘다 차이 없음outer join 시 on으로 해야 원하는 결과를 얻을 수 있음(outer table에 null값 포함하여 행들이 다 살아있는 상태)on

velog.io

728x90