Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 레코드를 오름차순·내림차순으로 번갈아 정렬해 표시하는 방법

개요

네, 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 순서로 출력됩니다. 이 방식은 응용하면 대칭형 목록, 매칭 화면 등 다양한 곳에서 활용할 수 있습니다.