MySQL에서 IN() 조건을 사용하면 지정한 필드 기준으로 결과가 자동으로 정렬되어 반환됩니다. 만약 IN()에 나열한 값의 순서 그대로 결과를 유지하고 싶다면, ORDER BY 절과 FIND_IN_SET() 함수를 함께 사용하면 됩니다.
이번 글에서는 예제 테이블을 만들고, FIND_IN_SET()을 활용해 원하는 순서대로 결과를 조회하는 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성하기
먼저 FIND_IN_SET()의 동작을 확인하기 위해 간단한 테이블을 생성해 보겠습니다. 테이블 생성 쿼리는 다음과 같습니다.
mysql> create table ProductStock -> ( -> ProductId int, -> ProductName varchar(20), -> ProductQuantity int, -> ProductPrice float -> ); Query OK, 0 rows affected (0.79 sec)
2. 샘플 데이터 삽입하기
이제 INSERT 명령어를 사용해 테이블에 몇 개의 레코드를 추가합니다.
mysql> insert into ProductStock values(1,'Product-101',10,500.56); Query OK, 1 row affected (0.20 sec) mysql> insert into ProductStock values(25,'Product-111',5,150.00); Query OK, 1 row affected (0.21 sec) mysql> insert into ProductStock values(67,'Product-311',7,1000.50); Query OK, 1 row affected (0.60 sec) mysql> insert into ProductStock values(55,'Product-561',8,900.00); Query OK, 1 row affected (0.24 sec) mysql> insert into ProductStock values(75,'Product-221',15,670.56); Query OK, 1 row affected (0.14 sec)
3. 전체 레코드 조회하기
SELECT 문을 사용해 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> select *from ProductStock;
출력 결과
+-----------+-------------+-----------------+--------------+ | ProductId | ProductName | ProductQuantity | ProductPrice | +-----------+-------------+-----------------+--------------+ | 1 | Product-101 | 10 | 500.56 | | 25 | Product-111 | 5 | 150 | | 67 | Product-311 | 7 | 1000.5 | | 55 | Product-561 | 8 | 900 | | 75 | Product-221 | 15 | 670.56 | +-----------+-------------+-----------------+--------------+ 5 rows in set (0.00 sec)
4. FIND_IN_SET()으로 원하는 순서대로 정렬하기
아래는 IN() 조건과 함께 FIND_IN_SET()을 사용해, 나열한 순서(25 → 55 → 67 → 75 → 1) 그대로 결과를 조회하는 쿼리입니다.
mysql> select *from ProductStock -> where ProductId IN(25,55,67,75,1) -> order by find_in_set(ProductId,'25,55,67,75,1');
출력 결과
+-----------+-------------+-----------------+--------------+ | ProductId | ProductName | ProductQuantity | ProductPrice | +-----------+-------------+-----------------+--------------+ | 25 | Product-111 | 5 | 150 | | 55 | Product-561 | 8 | 900 | | 67 | Product-311 | 7 | 1000.5 | | 75 | Product-221 | 15 | 670.56 | | 1 | Product-101 | 10 | 500.56 | +-----------+-------------+-----------------+--------------+ 5 rows in set (0.31 sec)
정리
FIND_IN_SET(ProductId, '25,55,67,75,1')은 두 번째 인자로 전달된 문자열 목록에서 해당 값이 몇 번째 위치에 있는지를 반환합니다. 이 값을 ORDER BY의 정렬 기준으로 사용하면, IN() 목록에 작성한 순서 그대로 결과를 얻을 수 있습니다. 이 방식은 우선순위가 정해진 항목들을 특정 순서로 조회해야 할 때 매우 유용하게 활용됩니다.