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

MySQL에서 특정 행은 무작위로 정렬하고 나머지는 기준에 따라 정렬하는 방법

ORDER BY와 CASE를 활용한 혼합 정렬 방법

데이터베이스 작업을 하다 보면 특정 그룹의 행은 무작위(RANDOM) 순서로 표시하고, 나머지 행은 지정한 기준에 따라 정렬해야 하는 경우가 있습니다. 이럴 때 ORDER BY 절과 CASE 문을 함께 사용하면 손쉽게 해결할 수 있습니다.

1. 예제 테이블 생성하기

먼저 실습에 사용할 테이블을 생성합니다.

mysql> create table DemoTable1926
   (
   Position varchar(20),
   Number int
   );
Query OK, 0 rows affected (0.00 sec)

2. 샘플 데이터 삽입하기

INSERT 명령을 사용하여 테이블에 레코드를 추가합니다.

mysql> insert into DemoTable1926 values('Highest',50);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1926 values('Highest',30);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1926 values('Lowest',100);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1926 values('Lowest',120);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1926 values('Lowest',90);
Query OK, 1 row affected (0.00 sec)

3. 저장된 데이터 확인하기

SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

mysql> select * from DemoTable1926;

실행 결과는 다음과 같습니다.

+----------+--------+
| Position | Number |
+----------+--------+
| Highest  |     50 |
| Highest  |     30 |
| Lowest   |    100 |
| Lowest   |    120 |
| Lowest   |     90 |
+----------+--------+
5 rows in set (0.00 sec)

4. 무작위 정렬과 기준 정렬을 결합한 쿼리

이제 'Highest' 행은 RAND() 함수를 통해 무작위로 배치하고, 나머지 행은 Number 값을 기준으로 오름차순 정렬하는 쿼리를 살펴보겠습니다.

mysql> select * from DemoTable1926
   order by Position desc,case Position when 'Highest' then rand()
   else Number end asc;

위 쿼리의 실행 결과는 다음과 같습니다.

+----------+--------+
| Position | Number |
+----------+--------+
| Lowest   |     90 |
| Lowest   |    100 |
| Lowest   |    120 |
| Highest  |     50 |
| Highest  |     30 |
+----------+--------+
5 rows in set (0.00 sec)

쿼리 동작 원리

이 쿼리가 어떻게 동작하는지 단계별로 살펴보겠습니다.

첫 번째 정렬 조건: Position desc는 Position 열을 내림차순으로 정렬합니다. 알파벳 순서상 'Lowest'가 'Highest'보다 앞에 오므로, 'Lowest' 그룹이 먼저 표시됩니다.

두 번째 정렬 조건: case Position when 'Highest' then rand() else Number end asc는 각 행마다 다르게 적용됩니다. Position 값이 'Highest'인 행에는 RAND() 함수가 적용되어 매번 실행할 때마다 무작위 순서로 배치되고, 그 외의 행('Lowest')에는 Number 열의 값이 사용되어 오름차순으로 정렬됩니다.

이처럼 CASE 문을 ORDER BY 절 안에서 활용하면 행 그룹별로 서로 다른 정렬 규칙을 유연하게 적용할 수 있습니다. 이 기법은 추천 상품 노출, 광고 영역 배치 등 특정 항목만 랜덤하게 보여주고 나머지는 정렬해야 하는 실무 시나리오에서 유용하게 활용됩니다.