연구개발 이야기

웹프로그램 연구(XIV) SQL JOIN으로 명단을 추출하는 방법

금메달.아빠 2012. 1. 8. 06:30
하나의 보고 시스템이라고 가정할 때 문제에 대한 보고 메일을 여러사람에게 송신하려고 한다.
table: t1; field: id, f1, user1, user2
table: t2; field: id, name, email
user1 은 담당자이고 user2는 책임자라고 할 때 동일한 테이블에서 서로다른 사용자 정보를 t2와 연결해 주어야 한다.

처음에는 user1만 필요했으므로
  1. SELECT f1, user1 FROM t1;
  2. SELECT name, email FROM t2 WHERE id = $user;
를 연속 실행하는 것으로 만족할 수 있다. (여기서 $user는 결과값을 저장한 변수이다.)
그러나 두사람의 메일을 보내려는 용도로 만들려면?
  1. SELECT name, email FROM t2 WHERE id IN ($user1, $user2);
를 사용하면 된다.

비가 내리는 중에도 너도 나도 사진을 찍고 있는 전철역


그러나 여러 가지 시행착오를 거쳐서 시험해본 결과 이런 두가지 쿼리를 하나로 묶어서 실행하는 것이 편리하다는 것을 알게 되었다. 설사 user정보를 각각 얻어온 SQL 실행 결과가 있더라도 메일, 사용자 정보를 취득하는 전용의 SQL문을 사용하는 것이 편리하다.

두개의 SQL문을 잇는 방법에도 서브쿼리를 쓰는 방법과 UNION을 쓰는 방법도 시험해 보았는데 가장 직관적이고 성능적인 것은 연결문, JOIN을 사용하는 것이었다.
  1. SELECT t2.name, t2.email
    FROM t2 INNER JOIN t1 ON (t2.id IN(t1.user1, t1.user2))
    WHERE t2.id <> $my_id;
마지막에 사용한 조건절, "t2.id <> $my_id" 은 자기 자신에게는 메일을 보내지 않는 방식으로 조건을 추가한 것이다. 여기에는 결과값을 저장한 변수가 등장하지 않고 데이터베이스 내에서 루프를 처리해 주기 때문에 간결하게 해결된다.

JOIN 문에서 눈여겨 볼 부분은 ON 조건에서 등호를 사용한 비교가 아니라 다양한 조건을 사용해도 된다는 점이다. 지금까지는 흔히 하나의 필드만을 동등 비교를 사용한 예를 많이 보아와서 다른 방법 --- Subquery, UNION등 --- 을 고려해 보았지만 ON 조건에서 복수 조건을 사용할 수 있는 것이다.
참고: http://dev.mysql.com/doc/refman/5.6/en/join.html
물론 SQL문은 모두 데이터베이스에 넣어 자원화하는 것은 두말할 필요가 없다.