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

MySQL에서 사용자 정의 변수 값과 가장 가까운 레코드를 조회하는 방법

MySQL에서 특정 값(사용자 정의 변수)과 수치상 가장 가까운 레코드를 조회해야 하는 경우가 종종 있습니다. 이럴 때 ABS() 함수와 ORDER BY, LIMIT 절을 조합하면 간단하게 해결할 수 있습니다. 아래 예제를 통해 단계별로 살펴보겠습니다.

1. 테이블 생성

먼저 데모용 테이블을 생성합니다.

mysql> create table DemoTable
(
    CustomerId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ProductAmount int
);
Query OK, 0 rows affected (0.61 sec)

2. 샘플 데이터 삽입

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

mysql> insert into DemoTable(ProductAmount) values(5000);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(ProductAmount) values(6000);
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable(ProductAmount) values(7000);
Query OK, 1 row affected (0.26 sec)

3. 저장된 데이터 확인

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

mysql> select *from DemoTable;

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

+------------+---------------+
| CustomerId | ProductAmount |
+------------+---------------+
|          1 |          5000 |
|          2 |          6000 |
|          3 |          7000 |
+------------+---------------+
3 rows in set (0.00 sec)

4. 사용자 정의 변수 설정 후 가장 가까운 값 조회

이제 사용자 정의 변수 @value에 6990을 설정하고, 이 값과 가장 가까운 레코드를 조회하는 쿼리를 실행합니다.

mysql> set @value=6990;
Query OK, 0 rows affected (0.00 sec)
mysql> select ProductAmount from DemoTable order by ABS(ProductAmount-@value) LIMIT 1;

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

+---------------+
| ProductAmount |
+---------------+
|          7000 |
+---------------+
1 row in set (0.00 sec)

동작 원리

ABS(ProductAmount - @value)는 각 행의 ProductAmount 값과 변수 값 사이의 절대적인 차이(거리)를 계산합니다. 이 차이를 기준으로 오름차순 정렬한 뒤 LIMIT 1로 첫 번째 행만 가져오면, 자연스럽게 목표 값에 가장 가까운 레코드가 반환됩니다.

참고 사항

만약 동일한 거리를 가진 값이 여러 개 존재할 수 있다면, LIMIT 1 대신 조건을 활용하거나 서브쿼리로 최소 차이 값을 구한 후 해당하는 모든 행을 조회하는 방식으로 확장할 수 있습니다. 또한 대량의 데이터를 다룰 때는 이 방식이 인덱스를 활용하지 못하고 전체 스캔이 발생할 수 있으므로 성능에 유의해야 합니다.