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

MySQL에서 WHERE id IN (...) 조건으로 지정한 순서대로 결과를 정렬하는 방법

MySQL에서 WHERE id IN (...) 조건을 사용할 때, 기본적으로 결과는 지정한 값의 순서가 아닌 임의의 순서(주로 저장 순서나 인덱스에 따라)로 반환됩니다. 만약 IN 절에 나열한 값의 순서 그대로 결과를 가져오고 싶다면 FIND_IN_SET() 함수를 활용해야 합니다.

FIND_IN_SET()을 이용한 정렬 문법

FIND_IN_SET() 함수는 문자열 목록에서 특정 값이 몇 번째 위치에 있는지를 반환하므로, 이를 ORDER BY 절과 함께 사용하면 원하는 순서대로 정렬할 수 있습니다.

SELECT * FROM yourTableName
WHERE yourColumnName IN (yourValue1, yourValue2, yourValue3, ...N)
ORDER BY FIND_IN_SET(yourColumnName, 'yourValue1,yourValue2,yourValue3,...N');

예제 테이블 생성하기

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

mysql> create table FindInSetDemo
    -> (
    -> Id int,
    -> Name varchar(20),
    -> Age int
    -> );
Query OK, 0 rows affected (0.54 sec)

레코드 삽입하기

INSERT 명령어를 사용해 테이블에 여러 레코드를 삽입합니다.

mysql> insert into FindInSetDemo values(10,'John',23);
Query OK, 1 row affected (0.20 sec)
mysql> insert into FindInSetDemo values(1,'Carol',21);
Query OK, 1 row affected (0.17 sec)
mysql> insert into FindInSetDemo values(4,'Bob',25);
Query OK, 1 row affected (0.19 sec)
mysql> insert into FindInSetDemo values(6,'Sam',26);
Query OK, 1 row affected (0.15 sec)
mysql> insert into FindInSetDemo values(7,'Maxwell',29);
Query OK, 1 row affected (0.18 sec)
mysql> insert into FindInSetDemo values(8,'Mike',22);
Query OK, 1 row affected (0.13 sec)
mysql> insert into FindInSetDemo values(2,'David',27);
Query OK, 1 row affected (0.20 sec)
mysql> insert into FindInSetDemo values(3,'James',20);
Query OK, 1 row affected (0.20 sec)

전체 레코드 조회하기

SELECT 문으로 테이블의 모든 레코드를 확인합니다.

mysql> select *from FindInSetDemo;

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

+------+---------+------+
| Id   | Name    | Age  |
+------+---------+------+
|   10 | John    | 23   |
|    1 | Carol   | 21   |
|    4 | Bob     | 25   |
|    6 | Sam     | 26   |
|    7 | Maxwell | 29   |
|    8 | Mike    | 22   |
|    2 | David   | 27   |
|    3 | James   | 20   |
+------+---------+------+
8 rows in set (0.00 sec)

IN 절 순서대로 정렬하는 쿼리

이제 WHERE id IN () 조건과 함께 FIND_IN_SET()을 사용해 지정한 순서대로 결과를 조회하는 쿼리를 실행합니다.

mysql> select *from FindInSetDemo
    -> where Id IN (1,4,6,7)
    -> order by FIND_IN_SET(Id, '1,4,6,7');

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

+------+---------+------+
| Id   | Name    | Age  |
+------+---------+------+
|    1 | Carol   |   21 |
|    4 | Bob     |   25 |
|    6 | Sam     |   26 |
|    7 | Maxwell |   29 |
+------+---------+------+
4 rows in set (0.00 sec)

위 결과를 보면 Id가 1, 4, 6, 7인 레코드가 IN 절에 나열한 순서 그대로 반환된 것을 확인할 수 있습니다. 이처럼 FIND_IN_SET() 함수를 ORDER BY와 함께 사용하면 MySQL에서 원하는 사용자 지정(custom) 정렬 순서를 손쉽게 구현할 수 있습니다.