MySQL에서 특정 행의 값을 항상 상단에 고정하고, 나머지 행들은 무작위(랜덤) 순서로 표시하고 싶다면 RAND() 함수와 ORDER BY 절을 함께 활용하면 됩니다.
테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1921
(
Number int
);
Query OK, 0 rows affected (0.00 sec)
데이터 삽입하기
INSERT 명령어를 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable1921 values(40);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1921 values(80);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1921 values(820);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1921 values(10);
Query OK, 1 row affected (0.00 sec)
저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1921;
실행 결과는 다음과 같습니다.
+--------+
| Number |
+--------+
| 40 |
| 80 |
| 820 |
| 10 |
+--------+
4 rows in set (0.00 sec)
특정 값 고정 후 나머지 행 랜덤 정렬 쿼리
아래 쿼리는 Number가 40인 행을 항상 맨 위에 고정하고, 나머지 행들은 RAND()를 이용해 무작위 순서로 출력합니다.
mysql> select * from DemoTable1921
order by (Number=40)desc,rand();
실행 결과는 다음과 같습니다.
+--------+
| Number |
+--------+
| 40 |
| 820 |
| 10 |
| 80 |
+--------+
4 rows in set (0.00 sec)
쿼리 동작 원리
이 쿼리가 작동하는 방식은 다음과 같습니다.
(Number=40) 조건은 해당 행에 대해서는 1, 그 외에는 0을 반환합니다. 이를 DESC로 내림차순 정렬하면 값이 40인 행이 항상 가장 앞에 위치하게 됩니다. 이후 두 번째 정렬 기준인 RAND()가 나머지 행들의 순서를 매번 실행할 때마다 무작위로 섞어 줍니다.
따라서 쿼리를 반복 실행하면 첫 번째 행은 계속 40으로 유지되지만, 나머지 행들(820, 10, 80)의 순서는 실행할 때마다 달라지는 것을 확인할 수 있습니다.