데이터베이스 > 관계형데이터베이스 > MYSQL,MSSQL,ORACLE


topic 테이블의  author 데이터의 중복 최소화


user 테이블을 하나 더 만들어 두개의 테이블로 관리


SELECT title,name FROM topic LEFT JOIN user ON topic.author = user.id


topic 테이블을 기준으로 user 테이블과 합쳐서 조회 (기준은 토픽의 author 과 user의 id 일치)


topic


id 

 title

description 

author 

created 

 1

 

 

 1

 

 2

 

 

 2

 

 3

 

 

 1

 


user


id 

 name

password 

 1

 egoing

 111111

 2

 haha

 222222

 3

 hoho

 333333



데이터 추가 


1. 두 개의 테이블을 하나의 테이블로 합쳐서 조회 후에 에플리케이션 본문에 글을 쓴 글쓴이가 출력되도록 한다.


$sql = 'SELECT topic.id (토픽 테이블의 아이디),title,name,description FROM topic LEFT JOIN user ON topic.author = name.id WHERE topic.id='" $_GET['id']"'";


-> 입력값으로 받은 주소창의 id 값과 일치하는 topic의 title과 description 조회 + topic 테이블의 author 번호와 같은 user id 해당 행의 name 조회


아티클 부분 (조건문 생략)


$result=mysqli_query($conn,$sql);

$row= mysqli_fetch_assoc($result);

echo '<h2>'.$row['title'].'</h2>';

echo '<p>'$row['name'']</p>';      -> user테이블에서 받아온 id에 해당하는 author와 숫자가 같은 id의 name을 불러온다.

echo $row['description'];



2. 에플리케이션에서 topic 테이블에 데이터를 추가할 때, author는 저자 입력 값(write.php를 통해 입력한)을 user 테이블 조회를 통해 찾은 해당 저자의 id를 넣는다.


user 테이블에서 입력 받은 저자의 id 찾기


2-1) 조건 값 따지지 않고 코드 작성시


$sql = "SELECT * FROM user WHERE name = '".$_POST['author']."'";  write.php에서 입력 받은 author 필드값을에 해당하는 번호와 같은 user id 행의 정보를 조회한다는 쿼리문을 변수 sql에 저장한다.

$result = mysqli_query($conn, $sql); -> 조회한 값 리턴

$row = mysqli_fetch_assoc($result); -> 연관배열로 한 행 불러옴

$user_id = $row['id']; 해당 user id값을 변수 user_id로 지정



2-2) 조건 따지고 코드 작성시


※ 저자 입력값이 user 테이블에 있는 경우가 있고 없는 경우가 있다. 없는 경우에는 user테이블에 해당 저자를 먼저 추가해줘야 한다. (조건문 사용) 


입력값이 user 테이블에 없는 경우, user 테이블에서 조회한 행의 수는 0이 된다. (조회된 경우에는 1로 표시됨)

num_rows 함수 -> 입력한 SQL문 결과 값이 몇 개인가를 타나냄


$sql = "SELECT * FROM user WHERE name = '".$_POST['author']."'";  

$result = mysqli_query($conn, $sql); 


if($row->num_rows == 0 ) {

$sql = "INSERT INTO user (name,password) VALUES ('".$_POST['author']."','"111111"'"); -> 입력받은 author 값과 111111로 된 비번을 user 테이블 행에 추가하는 sql문을 $sql 변수에 담는다
mysqli_query($conn, $sql); -> sql을 실행한다 (하나의 행을 추가하는 것이므로 리턴값은 필요 없음(변수 지정X) )
$user_id = mysqli_select_id($conn); -> mysqli_select_id라는 함수는, 이 함수 실행 직전에 추가된 행의 아이디 값을 알아내는 내장함수이다. 알아낸 아이디를 변수 $user_id에 담는다.


} else {

$row = mysqli_fetch_assoc($result); 

$user_id = $row['id']; 


};




topic 테이블에 데이터 추가시, author에는 위에서 찾은 id값 넣기


$sql = "INSERT INTO topic (title,description,author,created) VALUES ('".$_POST['titile']."','".$_POST['description']."','".$user_id."',now())";

$result=mysqli_query($conn,$sql);

header('Location: http://localhost/index.php');







exit; - 실행 종료


num_rows -> 입력한 SQL문 결과값이 몇 개인가?

'프로그래밍 > 코딩야학' 카테고리의 다른 글

라이브러리 이론, 실습1  (0) 2017.06.21
데이터 보안  (0) 2017.06.20
데이터베이스 실습  (0) 2017.06.19
데이터 베이스  (0) 2017.06.19
PHP 실습  (0) 2017.06.16
복사했습니다!