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

MySQL에서 하나의 특정 행과 임의의 행을 함께 선택하는 방법

개요

MySQL에서 하나의 특정 행을 반드시 포함시키면서, 그 외의 행들은 무작위로 함께 조회하고 싶다면 ORDER BY 절과 RAND() 함수를 조합하면 됩니다. 핵심 아이디어는 원하는 특정 행을 정렬 기준의 최상위에 두고, 나머지 행들은 무작위 순서로 정렬하는 것입니다.

먼저 예제에 사용할 샘플 테이블을 생성해 보겠습니다.

샘플 테이블 생성

mysql> create table oneSpecificRowAndOtherRandom
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> Name varchar(20)
    -> );
Query OK, 0 rows affected (0.72 sec)

레코드 삽입

INSERT 명령을 사용해 테이블에 몇 개의 레코드를 삽입합니다.

mysql> insert into oneSpecificRowAndOtherRandom(Name) values('Larry');
Query OK, 1 row affected (0.56 sec)

mysql> insert into oneSpecificRowAndOtherRandom(Name) values('Sam');
Query OK, 1 row affected (0.13 sec)

mysql> insert into oneSpecificRowAndOtherRandom(Name) values('Mike');
Query OK, 1 row affected (0.12 sec)

mysql> insert into oneSpecificRowAndOtherRandom(Name) values('Carol');
Query OK, 1 row affected (0.15 sec)

mysql> insert into oneSpecificRowAndOtherRandom(Name) values('Chris');
Query OK, 1 row affected (0.21 sec)

mysql> insert into oneSpecificRowAndOtherRandom(Name) values('Bob');
Query OK, 1 row affected (0.13 sec)

mysql> insert into oneSpecificRowAndOtherRandom(Name) values('David');
Query OK, 1 row affected (0.13 sec)

테이블 데이터 확인

SELECT 명령으로 테이블에 저장된 전체 레코드를 조회해 보겠습니다.

mysql> select *from oneSpecificRowAndOtherRandom;

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

+----+-------+
| Id | Name  |
+----+-------+
| 1  | Larry |
| 2  | Sam   |
| 3  | Mike  |
| 4  | Carol |
| 5  | Chris |
| 6  | Bob   |
| 7  | David |
+----+-------+
7 rows in set (0.00 sec)

특정 행과 임의의 행을 함께 선택하는 쿼리

이제 Id가 5인 행(Chris)을 항상 첫 번째로 고정하고, 나머지 행들 중에서 무작위로 2개를 더 선택하는 쿼리를 살펴보겠습니다.

mysql> select *from oneSpecificRowAndOtherRandom ORDER BY (Id= 5) DESC, RAND() LIMIT 0,3;

여기서 (Id = 5)는 해당 조건이 참인 행에 대해 1을 반환하고, 나머지 행에는 0을 반환합니다. 이 값을 내림차순(DESC)으로 정렬하면 Id가 5인 행이 항상 맨 앞에 오게 되고, 그 뒤의 행들은 RAND()에 의해 무작위 순서로 배치됩니다.

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

+----+-------+
| Id | Name  |
+----+-------+
| 5  | Chris |
| 1  | Larry |
| 2  | Sam   |
+----+-------+
3 rows in set (0.05 sec)

RAND()에 의한 무작위성 확인

RAND() 함수를 사용했기 때문에 동일한 쿼리를 다시 실행하면 특정 행(Id=5)은 그대로 유지되지만, 나머지 행들의 순서는 매번 달라집니다.

mysql> select *from oneSpecificRowAndOtherRandom ORDER BY (Id= 5) DESC, RAND() LIMIT 0,3;

두 번째 실행 결과입니다. 첫 번째 행은 여전히 Chris로 고정되어 있지만, 나머지 두 행은 이전과 다르게 선택된 것을 확인할 수 있습니다.

+----+-------+
| Id | Name  |
+----+-------+
| 5  | Chris |
| 2  | Sam   |
| 4  | Carol |
+----+-------+
3 rows in set (0.00 sec)

정리

이처럼 ORDER BY (조건) DESC, RAND() 패턴을 활용하면 특정 행을 항상 상단에 고정하면서 나머지 행들을 무작위로 섞어 조회할 수 있습니다. 추천 콘텐츠에 광고나 지정 항목을 고정하고 싶은 경우 등 다양한 실무 시나리오에서 유용하게 활용할 수 있습니다.