728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/276035
정답 코드
WITH FRONTEND_SKILLS AS(
SELECT CODE
FROM SKILLCODES
WHERE CATEGORY = "Front End"
)
SELECT DISTINCT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS JOIN FRONTEND_SKILLS ON SKILL_CODE & CODE
ORDER BY ID;
# 여러 개의 skill들을 가지고 있으면 중복되어 나타날 수 있기 때문에 DISTINCT를 써줘야함
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS
WHERE SKILL_CODE & (
SELECT
SUM(CODE)
FROM
SKILLCODES
WHERE
CATEGORY = 'Front End'
)
ORDER BY ID;
# 전체 프론트엔드 코드들의 합과 연산하기 때문에 DISTINCT를 안써도 됨
# 하나라도 포함하고 있다면 한 비트라도 1을 가지고 있을테니까 True인거고
# 아예 없으면 0이니까 False가 나올 것임
예를 들어 어떤 개발자의 SKILL_CODE가 400 (=b'110010000')이라면, 이는 SKILLCODES 테이블에서 CODE가 256 (=b'100000000'), 128 (=b'10000000'), 16 (=b'10000') 에 해당하는 스킬을 가졌다는 것을 의미합니다.
-> 그렇기 때문에 SKILL_CODE = CODE라고 하면 안됨. 여러 스킬을 가지고 있는 사람은 스킬들의 합을 값으로 가지고 있기 때문에
BIN 함수
MySQL에서 10진수를 2진수로 변환
SELECT BIN(숫자);
문자열의 오른쪽 끝에서 특정 위치의 문자를 추출
# 문자열 '0010000'에서 오른쪽에서 5번째 문자를 추출하는 쿼리
SELECT SUBSTRING(RIGHT('0010000', 5), 1, 1);
# RIGHT('0010000', 5)는 문자열 '0010000'의 오른쪽 끝에서 5개의 문자를 가져옵니다.
# 결과는 '10000'입니다.
# SUBSTRING('10000', 1, 1)는 위 결과로부터 첫 번째 문자를 추출합니다. 결과는 '1'입니다.
728x90
반응형
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[MySQL] 프로그래머스 276013. Python 개발자 찾기 (0) | 2024.03.02 |
---|---|
[MySQL] 프로그래머스 131123. 즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2024.03.01 |
[MySQL] 프로그래머스 131534. 상품을 구매한 회원 비율 구하기 (0) | 2024.03.01 |
[MySQL] 프로그래머스 131533. 상품 별 오프라인 매출 구하기 (0) | 2024.03.01 |
[MySQL] 프로그래머스 59045. 보호소에서 중성화한 동물 (0) | 2024.03.01 |