사용 가능한 값 중 최소값 구하기
- 챗봇을 만들기 위해 DB 테이블을 구상하는데 필요해진 알고리즘(?) 입니다.
- 저는 제가 즐겨하던 모바일 게임이 있는데 모바일 게임 특성상 인게임에서 채팅이 번거롭기 때문에 카카오톡 오픈채팅에서 파티를 구성한 후 보스를 잡는 형식으로 진행을 합니다. 이때 챗봇 이라는 것을 사용하는데 보스를 잡는 파티 명단을 작성 할 때 채팅방에 사람이 많으면 명단이 누락되는 경우가 발생하며 이를 방지하기 위해 명단 챗봇을 사용합니다.
- 명단은 보스를 잡으면 지워야 하기 때문에 명단의 삭제와 생성이 자주 일어나며 새로 생길 팀의 번호를 매기는 일은 사용했던 번호를 사용하는게 사용자 입장에서 더 편하게 됩니다. 따라서 명단 챗봇이 새로운 팀을 생성할 때 팀의 번호를 부여하게 됩니다.
- 이때 사용하는 쿼리문으로 결국엔 사용 가능한 값 중 최소값을 구하는 쿼리문 입니다.
mysql> SELECT * FROM C;
+------+
| idx |
+------+
| 1 |
| 2 |
| 4 |
| 6 |
| 8 |
+------+
5 rows in set (0.00 sec)
- 예를들어, 위와 같은 팀이 이미 존재한다고 가정합니다. [1,2,4,6,8] 팀이 존재합니다.
- 여기서 사용 가능한 팀은 3,5,7,9,,,N 팀이 있으며 이중 최소값은 3팀입니다.
- 이를 구하기 위해
LEFT JOIN
을 사용해 오른쪽에 테이블을 하나 추가할 수 있습니다.
mysql> SELECT * FROM C c1 LEFT JOIN C c2 ON c1.idx+1 = c2.idx;
+------+------+
| idx | idx |
+------+------+
| 1 | 2 |
| 2 | NULL |
| 4 | NULL |
| 6 | NULL |
| 8 | NULL |
+------+------+
5 rows in set (0.00 sec)
- 이는 위와 같으며, 여기에 하나의 조건을 추가해 아래와 같이 만들 수 있습니다.
mysql> SELECT * FROM C c1 LEFT JOIN C c2 ON c1.idx+1 = c2.idx WHERE c2.idx IS NULL;
+------+------+
| idx | idx |
+------+------+
| 2 | NULL |
| 4 | NULL |
| 6 | NULL |
| 8 | NULL |
+------+------+
4 rows in set (0.00 sec)
c1.idx+1
이 매치되는 경우가 있다면 이는 다음값이 이미 존재한다는 의미 이므로 우리에게는 필요한 값이 아닙니다. 따라서c2.dix
값이 NULL
인 경우만 출력했습니다.
mysql> SELECT MIN(c1.idx+1) FROM C c1 LEFT JOIN C c2 ON c1.idx+1 = c2.idx WHERE c2.idx IS NULL;
+---------------+
| MIN(c1.idx+1) |
+---------------+
| 3 |
+---------------+
1 row in set (0.00 sec)
- 여기서 우린 최소값이 필요하므로
MIN()
함수를 사용했고, 사용 가능한 최소값이므로 c1.idx+1
을 인자로 넘겨주어 3이라는 값을 얻을 수 있습니다.