지금까지의 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 )