문제
You are given a table, Functions, containing two columns: X and Y.
COLUMN | TYPE |
---|---|
X | Integer |
Y | Interger |
Two pairs (X1, Y1) and (X2, Y2) are said to be symmetric pairs if X1 = Y2 and X2 = Y1.
Write a query to output all such symmetric pairs in ascending order by the value of X. List the rows such that X1 ≤ Y1.
Sample Input
X | Y |
---|---|
20 | 20 |
20 | 20 |
20 | 21 |
23 | 22 |
22 | 23 |
21 | 20 |
Sample Output
20 20
20 21
22 23
문제 코드
SELECT X,Y
FROM functions
WHERE X = Y
GROUP BY X,Y
HAVING COUNT(*) = 2
UNION
SELECT f1.x, f1.y
FROM functions AS f1
INNER JOIN functions AS f2 ON f1.x = f2.y AND f1.y = f2.x
WHERE f1.x < f1.y
ORDER BY X ASC
문제 해석
그간 중급반에서 배우 개념을 전부 다 쓴 문제이다.WHERE,GROUP BY,HAVING,UNION,INNER JOIN,WHERE,ORDER BY를 사용했다.
문제는 table에 x,y 컬럼 2개가 있는데 x,y의 값들중 symmetric한 값들을 찾는것이 목표이다. 풀다가 어려워서 강의 영상을 참고하며 진행하였다.
해당문제는 2개의 파트로 나뉘어야하는데 x1,y1과 x2,y2가 전부 같은 조건 1개와 x1,y2와 x2,y2가 같은 조건 1개로 나뉘어진다.
이를 해결하기위헤 2개의 table로 나누어서 UNION을 해준다.
- 첫번째 (같은 조건)
SELECT X,Y
FROM functions
WHERE X = Y
을 사용하여 일단 값이 같은 인자들을 전부 불러온다. 그후 GROUP BY를 사용하여 x,y를 기준으로 같이 묶어준다. 그후 GROUP BY를 사용했으니 WHERE 절이 아닌 HAVING 절을 사용하여 묶였을때 COUNT가 2인 값들을 불러오면 된다.
- 두번쨰 ( x,y가 다른 조건)
SELECT f1.x, f1.y
FROM functions AS f1
INNER JOIN functions AS f2 ON f1.x = f2.y AND f1.y = f2.x
SELECT와 FROM은 위와 동일하다. INNER JOIN에서 한 테이블로 묶어야 하기 때문에 SELF JOIN개념을 사용한다. 이때 같은 테이블에서 column값을 가져오니까 AS를 사용하여 명확히 해준다. 또한 INNNE JOIN에 AND 조건을 사용하여 x1= y2, x2= y1의 같이 가진 테이블을 구성한다. 그후 List the rows such that X1 ≤ Y1.인 조건을 만족하기 위해 WHERE문을 사용하여 x가 y보다 작을때를 설정한다. 그리고 UNION으로 두개의 테이블을 합치면 해당 값들이 정렬이 되지않은 상태로 만들어지기 떄문에 ORDER BY를 사용하여 값을 정렬해주면 끝이다.
'SQL > MySQL' 카테고리의 다른 글
[MySQL] DML (Data Manipulation Language) 예제 문제 풀어보기 with LeetCode (0) | 2022.02.06 |
---|---|
[MySQL] DML (Data Manipulation Language) (0) | 2022.02.03 |
[MYSQL] 위 아래로 데이터 이어붙이기, UNION, UNION ALL (0) | 2022.01.29 |
[MYSQL] JOIN 예제문제 풀어보기 (0) | 2022.01.29 |
[MySQL] 시간 더하기 , 빼기 (0) | 2022.01.29 |