Test/MYSQL

Symmetric Pairs (INNER JOIN, GROUP BY, HAVING, ORDER BY, UNION)

soo15 2023. 5. 19. 19:50

[문제]

You are given a table, Functions, containing two columns: X and Y.

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

 

Sample Output

20 20
20 21
22 23

 


 

[나의 풀이]

SELECT F1.X, F1.Y
    FROM functions AS F1
        INNER JOIN functions AS F2 ON F1.X = F2.Y AND F1.Y = F2.X
    GROUP BY F1.X, F1.Y
    HAVING COUNT(F1.X) > 1 OR F1.X < F1.Y
    ORDER BY F1.X

 

출력결과

X Y
2 24
4 22
5 21
6 20
8 18
9 17
11 15
13 13

 


 

[설명]

1. INNER JOIN

> F1.X = F2.Y 그리고 F2.X = F1.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

 

X Y
1 1
2 2
2 24
24 2
4 4
:
:
:
:

 

참고) INNER JOIN 내용

2023.05.20 - [SQL/중급] - INNER JOIN, SELF JOIN

 

 

 

2. F1.X F1.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
    GROUP BY F1.X, F1.Y
    HAVING COUNT(F1.X) > 1 OR F1.X < F1.Y

> GROUP BY절 이용하여 그룹화하고 출력하면 중복값이 제거되어 나온다.

   ( 맨 위에 있는 값만 출력되기 때문)

> 둘 중 하나는 만족해야 하므로 OR를 작성한다.

 

참고) GROUP BY 내용

2023.05.19 - [SQL/초급] - 그룹화 하기 (GROUP BY, COUNT(*))

 

 

1)   F1.X = F1.Y

> 다음과 같이 같은 값을 같는 행이 2개 이상있어야 하므로

   COUNT(F1.X) > 1을 작성한다.

X Y
2 2
2 2

 

2)   F1.X  <  F1.Y

> 다음 값 중 F1.X < F1.Y인 값은 (X, Y) = (1, 2)일 때다.

X Y
1 2
2 1

 

 

 

3. F1.X를 오름차순으로 정렬하기

SELECT F1.X, F1.Y
    FROM functions AS F1
        INNER JOIN functions AS F2 ON F1.X = F2.Y AND F1.Y = F2.X
    GROUP BY F1.X, F1.Y
    HAVING COUNT(F1.X) > 1 OR F1.X < F1.Y
    ORDER BY F1.X

 

 


 

 

[다른 사람 풀이]

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

> UNION을 이용하여 작성하였다.


[설명]

1. X = Y일 때 같은 행이 2개인 값 출력

2. X < Y일 때 값 출력

3. 두 개의 갑을 UNION으로 합치기 (중복 제거됨)

4. UNION을 쓸 때에는 ORDER BY 가장 맨 뒤에 작성하기