개요
네, MySQL에서도 충분히 구현할 수 있습니다. 핵심은 먼저 전체 레코드의 중간값(middle value)을 구한 뒤, 이를 기준으로 각 행의 정렬 키를 다시 계산하는 것입니다. 아래 예제를 통해 단계별로 살펴보겠습니다.
1. 테이블 생성
먼저 실습에 사용할 테이블을 만듭니다.
mysql> create table DemoTable
(
UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY
);
Query OK, 0 rows affected (0.65 sec)2. 레코드 삽입
insert 명령으로 UserId가 자동 증가(AUTO_INCREMENT)되는 레코드를 삽입합니다. 아래 문장을 반복 실행해 총 10건을 넣어 줍니다.
mysql> insert into DemoTable values(); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable values(); Query OK, 1 row affected (0.10 sec) -- 위 문장을 반복 실행하여 총 10건 삽입
3. 저장된 데이터 확인
select 명령으로 현재 테이블에 저장된 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+--------+ | UserId | +--------+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 | +--------+ 10 rows in set (0.00 sec)
4. 중간값 구하기
사용자 변수 @middleValue에 최대 UserId를 2로 나눈 값을 저장합니다.
mysql> set @middleValue=(select max(UserId) from DemoTable)/2; Query OK, 0 rows affected (0.01 sec)
5. 오름차순·내림차순 교차 정렬 쿼리
IF 함수와 ORDER BY를 조합하면 원하는 교차 정렬 패턴을 얻을 수 있습니다.
mysql> select *from DemoTable ORDER BY (IF(UserId <@middleValue,@middleValue*2- UserId,UserId-1)) DESC,UserId ASC;
실행 결과는 다음과 같습니다.
+--------+ | UserId | +--------+ | 1 | | 10 | | 2 | | 9 | | 3 | | 8 | | 4 | | 7 | | 6 | | 5 | +--------+ 10 rows in set (0.00 sec)
동작 원리
이 쿼리가 어떻게 작동하는지 정리해 보겠습니다.
- 중간값 계산: 최대 UserId(10)를 2로 나누어 중간값 5를 구합니다.
- 정렬 키 재계산: UserId가 중간값보다 작으면 '중간값 × 2 − UserId'로, 그렇지 않으면 'UserId − 1'로 변환합니다.
- 교차 배치: 변환된 키를 기준으로 내림차순 정렬하고, 같은 키를 가진 행끼리는 UserId 오름차순으로 정렬합니다.
그 결과 UserId 1과 10, 2와 9처럼 가장 작은 값과 가장 큰 값이 한 쌍씩 짝지어져 1, 10, 2, 9, 3, 8, 4, 7, 6, 5 순서로 출력됩니다. 이 방식은 응용하면 대칭형 목록, 매칭 화면 등 다양한 곳에서 활용할 수 있습니다.