데이터베이스 > 관계형데이터베이스 > 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테이블에 해당 저자를 먼저 추가해줘야 한다. (조건문 사용)
$sql = "SELECT * FROM user WHERE name = '".$_POST['author']."'";
$result = mysqli_query($conn, $sql);
$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문 결과값이 몇 개인가?