[PHP] MySQL 2개 이상의 테이블 사용하기 JOIN

2022. 10. 6. 05:59Program/PHP

123_PHP MySQL 2개 이상의 테이블 사용하기 JOIN

[요약]

  • 연관있는 2개 이상의 테이블 레코드 정보를 불러오는 명령문 JOIN 에 대해 알아보자.

하나의 웹 서비스를 운영하려면 여러 테이블을 사용하게 된다.

포털사이트를 이용하기 위해 가입하는 회원 정보를 담는 테이블, 가입한 카페에 대한 테이블, 게시물을 담는 테이블, 게시물의 댓글을 담는 테이블, 구매한 상품 정보를 담는 테이블, 로그인 기록을 담는 테이블, 공지사항을 담는 테이블, 검색어를 담는 테이블 등 수많은 테이블이 존재한다. 따라서 2개 이상의 테이블을 다루는 방법에 대해 알아야 한다.

현재는 테이터베이스에 myMember 테이블만 있으므로 어떠한 상품의 리뷰 정보를 담는 테이블을 생성해보자.


[테이블 정보]

테이블 이름 : prodReview

필드 :
리뷰의 고유번호
리뷰를 작성한 회원번호
리뷰 내용
리뷰 작성 날짜

리뷰 정보를 담는 테이블 정보는 앞의 테이블 정보와 같이 구성한다.

그럼 이 구성으로 테이블을 생성해보자.

다음은 생성할 prodReview 테이블의 생성 쿼리문이다.

CREATE TABLE prodReview (
prodReviewID int unsigned auto_increment COMMENT '리뷰의 고유번호';
myMemberID int unsigned COMMENT '리뷰를 작성한 회원번호';
content tinytext COMMENT '리뷰 내용';
regDate datetime not null COMMENT '리뷰 작성 날짜';
primary key(prodReview))
CHARTSET=utf8 COMMENT='상품 리뷰';

prodReviewID 테이블은 리뷰 정보를 담는 테이블이다.prodReviewID 필드는 리뷰의 고유번호이며, myMemberID  필드는 리뷰를 작성한 회원번호이다.content 필드에는 리뷰의 내용이 저장되며, regDate 필드에 리뷰 작성 일시를 받도록 한다.

 

다음은 prodReview 테이블을 생성하는 예제이다.

[예제: 126-1_join_create.php ]

<?php
    include $_SERVER['DOCUMENT_ROOT'] . '/php/108-2_connectDB.php';

    $sql = "CREATE TABLE prodReview (";
    $sql .= "prodReviewID int unsigned auto_increment COMMENT '리뷰의 고유번호',";
    $sql .= "myMemberID int unsigned COMMENT '리뷰를 작성한 회원번호',";
    $sql .= "content tinytext COMMENT '리뷰 내용',";
    $sql .= "regDate datetime not null COMMENT '리뷰 작성 날짜',";
    $sql .= "primary key(prodReviewID))";
    $sql .= "CHARSET=utf8 COMMENT='상품 리뷰';";

    $result = $dbConnect->query($sql);

    if ($result) {
      echo "테이블 생성 완료";
    } else {
      echo "테이블 생성 실패";
    }
?>

실행결과

SHOW TABLES 명령문으로 터미널이나 phpMyAdmin에서 생성한 테이블을 확인 할 수 있다.

 

생성한 prodReview에 데이터를 입력해보자.

[예제: 126-2_join_insert.php ]

<?php
    include $_SERVER['DOCUMENT_ROOT'] . '/php/108-2_connectDB.php';

    $reviewList = array();
    $reviewList[0] = [1, '초보자에게 좋아요'];
    $reviewList[1] = [2, '대박입니다'];
    $reviewList[2] = [3, '자주 올께요~'];
    $reviewList[3] = [4, '아주 좋습니다~~ 감사합니다.'];

    $cnt = 0;

    foreach ($reviewList as $rl) {
      $sql = "INSERT INTO prodReview(myMemberID, content, regDate) ";
      $sql .= "VALUES($rl[0], '$rl[1]', NOW())";

      $result = $dbConnect->query($sql);
      $cnt++;

      if ($result) {
        echo $cnt . ' 데이터 입력 성공' . '<br>';
      } else {
        echo $cnt . '데이터 입력 실패' . '<br>';
      }
    }
?>

prodReview 테이블에 입력할 데이터이다.

배열의 첫 번째 값은 회원번호이며 두 번째 값은 리뷰 내용이다.

반복문이 실행하는 동안 몇 번째 데이터의 입력 성공 여부를 확인하기 위한 카운트이다.

입력할 데이터가 배열로 존재하므로 foreach() 반복문을 사용해 쿼리문을 생성하여 데이터를 입력한다.

실행결과

MySQL에 접속하여 SELECT 문을 활용하여 데이터를 확인할 수 있다.

임의로 총 4개의 레코드를 입력했다. prodReview 테이블에는 리뷰 작성자의 이름 정보가 없다.

리뷰 내용과 함께 리뷰 작성자를 페이지에 표시하려면 JOIN문을 사용하여 prodReview 테이블의 리뷰 내용과 myMember 테이블 회원명을 함께 불러온다.

JOIN 명령문은 2개 이상의 테이블을 연결해주는 기능을 한다.

 

[JOIN문 사용하기]

SELECT 필드명 FROM 테이블명 앨리어스 JOIN 연결할 테이블명 앨리어스 ON(두 테이블의 연결고리 역할을 할 필드 조건문)

앨리어스라는 것은 테이블명의 별명을 짓는 것을 의미한다.

myMember 테이블을 짧게 m 이라고 이름지어도 되고 member라고 이름지어도 된다.

prodReview를 r이라고 이름지어도 되고 review라고 이름지어도 된다. 즉 원하는 이름을 붙일 수 있다.

이렇게 앨리어스를 붙여야 하는 이유는 JOIN문을 써야 하는 경우 필드명을 기입할 때 이 필드명이 어디에 있는 필드명인지 명시해야 하기 때문이다. 즉, myMemberID를 출력할 경우 myMemberID는 myMember 테이블에도 있고 prodReview 테이블에도 있기 때문에 이를 구분할 수 있어야 한다.

 

myMember에 있는 redDate의 경우 고객의 회원가입 시간 정보가 있지만, prodReview에 있는 redDate의 경우 고객이 리뷰를 입력한 시간 정보가 있기 때문에 고객이 리뷰를 입력한 시간을 출력하려면 prodReview 테이블에 있는 regDate 를 불러야 하므로 앨리어스가 필요한 것이다.

 

고객명, 리뷰 내용, 리뷰 등록 시간을 불러오는 쿼리문을 그림으로 표현하면 다음과 같다.

ON 은 2개 테이블의 공통값을 갖는 필드를 기입한다.

myMember 테이블의 myMemberID와 prodReview 테이블의 myMemberID는 같은 회원번호를 의미하므로 myMemberID를 기입해야 한다. 그럼 2개의 테이블을 이용하여 회원의 이름, 회원이 남긴 리뷰, 리뷰를 남긴 시간을 출력해보자.

 

다음은 JOIN을 사용한 쿼리문이다. 이 쿼리문으로 예제를 만들도록 한다.

SELECT m.name, r.content, r.regDate FROM myMember m JOIN prodReview r ON(m.myMemberID = r.myMemberID);

 

다음은 위의 코리문을 활용한 두 테이블의 데이터를 가져오는 예제이다.

[예제: 126-3_join.php ]

<?php
    include $_SERVER['DOCUMENT_ROOT'] . '/php/108-2_connectDB.php';

    $sql = "SELECT m.name, r.content, r.regDate FROM myMember m JOIN prodReview r ";
    $sql .= "ON (m.myMemberID = r.myMemberID);";

    $result = $dbConnect->query($sql);

    if ($result) {
      $dataCount = $result->num_rows;

      for ($i = 0; $i < $dataCount; $i++) {
        $reviewInfo = $result->fetch_array(MYSQLI_ASSOC);
        echo "{$reviewInfo['regDate']} - {$reviewInfo['name']}님, {$reviewInfo['content']}";
        echo "<br>";
      }
    }
?>

실행결과

 

 


 

 

 

초보자를 위한 PHP 200제
김태영 지음 | 정보문화사