지금까지의 JOIN 결합은 서로 다른 테이블을 결합하는 것입니다. SELF 조인은 자기 자 신의 동일한 테이블명끼리 결합하는 것을 말합니다.
| 쿼리 문법 |
SELECT 컬럼 FROM 테이블 AS 별명1 JOIN 테이블 AS 별명2;
20.6.1 쿼리 실습
다음은 SELF 조인 형태의 쿼리 예제입니다. 예제를 작성하고 출력 결과를 확인해 보도록 하겠습니다.
| 예제 쿼리 |
SELECT FirstName, LastName FROM members AS mem1 JOIN members AS mem2;
| 콘솔 실습 화면 |
mysql> SELECT FirstName, LastName FROM members;
+-----------+----------+
| FirstName | LastName |
+-----------+----------+
| lee | hojin |
| NULL | jiny |
| kim | james |
| jung | eric |
+-----------+----------+
4 rows in set (0.00 sec)
mysql> SELECT mem1.FirstName, mem1.LastName FROM members AS mem1 JOIN members AS mem2;
+-----------+----------+
| FirstName | LastName |
+-----------+----------+
| lee | hojin |
| NULL | jiny |
| kim | james |
| jung | eric |
| lee | hojin |
| NULL | jiny |
| kim | james |
| jung | eric |
| lee | hojin |
| NULL | jiny |
| kim | james |
| jung | eric |
| lee | hojin |
| NULL | jiny |
| kim | james |
| jung | eric |
+-----------+----------+
16 rows in set (0.00 sec)
셀프 조인을 하게 되면 자기의 모든 레코드에 대해서 다시 자신의 모든 레코드를 더하여 출력합니다. 셀프 조인은 자신의 데이터가 4개와 또 다시 4개가 처리되어 16개의 자료로 출력됩니다. 즉, 자신의 데이터의 ^2 형태의 자료가 생성됩니다.
셀프 조인을 사용할 때는 방대하게 생성되는 데이터 결과에 주의해야 합니다. 그럼에도 불구하고 셀프 조인을 사용하는 목적은 자신의 테이블의 모든 조건의 결과를 확인하기 위 해서입니다.
20.6.2 PHP 실습
PHP 코드를 통하여 SELF 조인을 실습해 보도록 하겠습니다.
| PHP 예제 | mysql.class.php 파일에 메서드 예제를 추가합니다.
// SELF 조인을 처리합니다.
public function selfJoin($tbname, $fields)
{
$queryString = "SELECT ";
// 컬럼필드 선택여부를 지정
if ($fields) {
$queryString .= $fields." ";
} else {
$queryString .= "* ";
}
$queryString .= "from $tbname as a JOIN $tbname as b";
if ($result = mysqli_query($this->dbcon, $queryString)) {
$this->msgEcho("쿼리성공] ".$queryString);
$rowss = "";
$row_cnt = mysqli_num_rows($result);
for ($i=0; $i<$row_cnt; $i++) {
$rowss[$i] = mysqli_fetch_object($result);
}
$result->free();
return $rowss;
} else {
$this->msgEcho("Error] ".$queryString);
}
}
예제 파일 | join-05.php
<?php
include "dbinfo.php";
include "mysql.class.php";
// ++ Mysqli DB 연결.
$db = new JinyMysql();
if ($rowss = $db->selfJoin("members","a.FirstName, b.LastName")) {
echo "tables fields = ". count($rowss) . "<br>";
for ($i=0;$i<count($rowss);$i++) {
echo $i."=";
print_r($rowss[$i]);
echo "<br>";
}
}
?>
화면 출력
mysql connected!
쿼리성공] SELECT a.FirstName, b.LastName from members as a JOIN members as b
tables fields = 36
0=stdClass Object ( [FirstName] => lee [LastName] => hojin )
1=stdClass Object ( [FirstName] => hojin [LastName] => hojin )
2=stdClass Object ( [FirstName] => kim [LastName] => hojin )
3=stdClass Object ( [FirstName] => jiny [LastName] => hojin )
4=stdClass Object ( [FirstName] => jiny [LastName] => hojin )
5=stdClass Object ( [FirstName] => jiny [LastName] => hojin )
6=stdClass Object ( [FirstName] => lee [LastName] => lee )
7=stdClass Object ( [FirstName] => hojin [LastName] => lee )
8=stdClass Object ( [FirstName] => kim [LastName] => lee )
9=stdClass Object ( [FirstName] => jiny [LastName] => lee )
10=stdClass Object ( [FirstName] => jiny [LastName] => lee )
11=stdClass Object ( [FirstName] => jiny [LastName] => lee )
12=stdClass Object ( [FirstName] => lee [LastName] => james )
13=stdClass Object ( [FirstName] => hojin [LastName] => james )
14=stdClass Object ( [FirstName] => kim [LastName] => james )
15=stdClass Object ( [FirstName] => jiny [LastName] => james )
16=stdClass Object ( [FirstName] => jiny [LastName] => james )
17=stdClass Object ( [FirstName] => jiny [LastName] => james )
18=stdClass Object ( [FirstName] => lee [LastName] => 1234 )
19=stdClass Object ( [FirstName] => hojin [LastName] => 1234 )
20=stdClass Object ( [FirstName] => kim [LastName] => 1234 )
21=stdClass Object ( [FirstName] => jiny [LastName] => 1234 )
22=stdClass Object ( [FirstName] => jiny [LastName] => 1234 )
23=stdClass Object ( [FirstName] => jiny [LastName] => 1234 )
24=stdClass Object ( [FirstName] => lee [LastName] => 1234 )
25=stdClass Object ( [FirstName] => hojin [LastName] => 1234 )
26=stdClass Object ( [FirstName] => kim [LastName] => 1234 )
27=stdClass Object ( [FirstName] => jiny [LastName] => 1234 )
28=stdClass Object ( [FirstName] => jiny [LastName] => 1234 )
29=stdClass Object ( [FirstName] => jiny [LastName] => 1234 )
30=stdClass Object ( [FirstName] => lee [LastName] => 123400 )
31=stdClass Object ( [FirstName] => hojin [LastName] => 123400 )
32=stdClass Object ( [FirstName] => kim [LastName] => 123400 )
33=stdClass Object ( [FirstName] => jiny [LastName] => 123400 )
34=stdClass Object ( [FirstName] => jiny [LastName] => 123400 )
35=stdClass Object ( [FirstName] => jiny [LastName] => 123400 )