(velog에서 22.08.28 작성한 글입니다.0
👉🏻 문제보러가기
1. IN을 이용해서 풀기
💡풀이
- 공간을 둘 이상 등록한 헤비 유저를 찾는다. host_id를 기준으로 그룹핑, 등록한 공간의 id가 2이상인 host_id 출력한다.
SELECT host_id FROM Places GROUP BY host_id HAVING COUNT(id) >= 2
- 1번에서 찾은 host_id와 일치하는 공간의 정보를 출력한다.1번을 서브쿼리로 활용
SELECT *
FROM Places
WHERE host_id IN (SELECT host_id
FROM Places
GROUP BY host_id
HAVING COUNT(id) >= 2)
ORDER BY id)
2. JOIN을 이용해서 풀기
💡풀이
- Places 테이블을 host_id 기준으로 셀프조인한다.
SELECT * FROM Places P1 JOIN Places P2 ON P1.host_id = P2.host_id
아래와 같이 host_id가 같은 것끼리 테이블이 확장된다.
- 여기서, id가 같은 것들은 제외해준다.
host_id 기준으로 셀프 조인을 했을 때, id가 같은 row만 있다면 자기 자신 외에 host_id 가 같은 공간은 없다는 뜻이기 때문이다.SELECT * FROM Places P1 JOIN Places P2 ON P1.host_id = P2.host_id WHERE P1.id != P2.id
host_id는 같지만, 공간은 다른(id가 다른) 것끼리만 조인되어 남는다.
- 이 중 중복되는 것들만 제외하고 프린트해준다. 문제에서 요구한대로, id순서대로 정렬해준다.
#최종 코드 SELECT DISTINCT P1.id, P1.name, P1.host_id FROM Places P1 JOIN Places P2 ON P1.host_id = P2.host_id WHERE P1.id != P2.id ORDER BY P1.id
3. EXISTS를 이용해서 풀기
- IN을 이용했던 풀이와 같이, 공간을 둘 이상 등록한 헤비 유저를 찾는다.
-
SELECT * FROM Places GROUP BY host_id Having COUNT(id) >= 2
- EXISTS를 이용하여, 1번 서브쿼리의 결과에 '존재하는' 공간 정보만 출력해준다.
-
✔️ROW를 비교하여 체크해주기 때문에, JOIN을 해줄 때처럼 특정 컬럼을 기준으로 연동을 해줘야 한다.SELECT * FROM Places P1 WHERE EXISTS(SELECT * FROM Places P2 GROUP BY P1.host_id = P2.host_id Having COUNT(id) >= 2) ORDER BY id;
-> 따라서 동일한 테이블을 가지고 서브쿼리에서 비교해줄 때는, 위와 같이 alias를 사용하여 분리해줘야 한다.
✏️EXISTS에 대해 알아보자
EXISTS는 조건에 맞는 ROW에 서브쿼리에 존재하는지 체크한다.
- IN과 다른 점은,
- 조건에 해당하는 ROW가 서브쿼리에 존재 유무만을 체크함
<-> IN은 조건의 해당하는 ROW의'컬럼'을 비교해서 체크함 - SELECT 절의 컬럼값을 가지고 비교하는 IN에 비해서 성능이 좋음
- 조건에 해당하는 ROW가 서브쿼리에 존재 유무만을 체크함
- 조건에 맞지 않는 ROW만 추출하고 싶다면 NOT EXISTS를 사용!
'MySQL' 카테고리의 다른 글
프로그래머스 : 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (1) | 2023.04.21 |
---|---|
프로그래머스 : 조건에 맞는 사용자 정보 조회하기 (0) | 2023.04.13 |
SolveSQL : 지역별 자전거 대여 현황 문제 풀이 (다양한 방식으로 쿼리 짜보기) (0) | 2023.01.20 |
MySQL로 데이터 가공하는 몇 가지 케이스들 (0) | 2023.01.20 |