Backend/DB

[DB] 여러개의 테이블 값 참조하기

Emil :) 2020. 1. 13. 16:48
728x90
반응형

개요


크롤링 모니터링 페이지를 만들다가 결국 완성해서 이렇게 적어본다.
php랑 db랑 카테고리를 어디로 할까 하다가 ㅇㅅㅇ.. db가 좀더 핵심적인 부분같아서 db카테고리에 넣었따

오늘의 주제


핵심 과정이었던 여러개의 테이블에서 값 참조하는 것.
사실 알고나면 별로 안어렵다. 내가 몰랐던 거라 어려웠음

 

참고


https://lightblog.tistory.com/84

 

[MySQL] 다른 테이블에서 데이터 참조하기 JOIN (vlookup)

다음과 같은 데이터가 있다고 하자. 어떤 유저가 언제 어떤 물건을 샀는지 기록해 놓은 자료다. 짐작하다시피, product는 이전에 등장했던 product_data 테이블의 product_id 열과 대응된다. 저 유저가 산 품목..

lightblog.tistory.com

 

 

진행 과정


1. 테이블 구조 파악하기


먼저 주어진 테이블은 총 3개가 있다.

1. LogItemState

크롤링 된 데이터가 갱신되어 로그를 쌓는 테이블이다.
logitemStateIdx = 로그 인덱스
itemIdx = 아이템 인덱스, 이놈을 가지고 다른 테이블에 가서 찾아야됨
status = 물품의 상태, 입고, 품절, 삭제 가 있다.
registDate = 갱신된 시간

2. Item

크롤링한 모든 상품이 쌓이는 테이블이다. 가로가 너무 길어서 스샷은 간단하게 찍었음. 여기서 필요한건 4가지임
itemIdx = 위에서 찾은 아이템 인덱스로 얘를 가져온다.
rssSiteIdx = 해당 상품을 가지고 있는 사이트의 인덱스를 가지고 있는 놈이다.
linkUrl = 상품 링크임
tag = 쇼핑몰에서 제공하는 상품의 카테고리 명

 

3. rssSite

크롤링 대상이 된 쇼핑몰들의 리스트가 죽 나열되어있다. 총 46개임 여기서 필요한 정보는 2가지.
rssSiteIdx = Item 테이블에서 가져온 rssSiteIdx와 비교할것이다.
content = 쇼핑몰 이름

2. php문 짜기


일단 내가 원하고자 하는 이미지는 이런것이다. UI는 한참전에 구현해놨음

이렇게 쭉 내려오다가 갱신된 상품 갯수만 출력해주도록 한다.

<div class="crawling_test">
	<div class="card card-statistics h-100"> 
		<div class="card-body">
			<table class="table table-striped">
				<thead>
					<tr>
						<th> 구분 </th>			<!-- 신규, 삭제, 품절, 입고 !-->
						<th> 상품명 </th>			<!-- 상품 이름 !-->
						<th> 쇼핑몰명 </th>		<!-- 쇼핑몰명 !-->
						<th> 태그(카테고리) </th>	<!-- 카테고리 !-->
						<th> 갱신 시간 </th>		<!-- 갱신 시간 !-->
					</tr>
				</thead>
				<tbody>
					<?
						crawling_print();
					?>
				</tbody>
			</table>
			갱신된 상품이 <span style="color:red"><strong> '<? echo $updatedItemCount ?>' </strong></span> 개 있습니다.
		</div>
	</div>
</div>

코드는 이렇다.

 

<?php

$updatedItemCount = 0; //갱신된 상품의 갯수를 저장할 전역변수 선언

function crawling_print() {
	
	$mysql_host = '블라블라';
	$mysql_user = '블라블라';
	$mysql_pwd  = '블라블라';
	$mysql_db   = '블라블라'; 
	
	$con = mysqli_connect($mysql_host, $mysql_user, $mysql_pwd, $mysql_db) or die("서버 접속에 실패 했습니다. 계정 또는 패스워드를 확인하세요.");
	mysqli_select_db($con, $mysql_db) or die("DB 연결에 실패 했습니다. 데이터베이스명을 확인하세요.");
	mysqli_set_charset($con,"utf8");
    //위에서부터 여기까지는 그냥 db연결하는 곳이다. 신경쓰지말자
	
    //여기서 위의 참조 링크를 보면서 이해하는게 더 빠를거임
	$db_query = "SELECT L.status, L.registDate, I.linkUrl, I.title, I.tag, R.content FROM LogItemState AS L LEFT JOIN Item AS I ON L.itemIdx = I.itemIdx LEFT JOIN RssSite AS R ON I.rssSiteIdx = R.rssSiteIdx ORDER BY L.registDate DESC";
    
    //간단하게 말하자면, LogItemState를 L로, Item을 I로, RssSite를 R로 별칭지정하고, 거기서 필요한 정보만 select문에서 가져온다
    //그다음, LEFT JOIN을 써서 내가 원하는 조건인 다른 테이블에 있는 속성들만 가져오도록 한다. 마지막엔 갱신시간 내림차순으로 정렬함.
    
	$db_result = mysqli_query($con, $db_query);
    //여기도 db연결하는곳
    
    //여기는 쿼리문 결과를 배열로 만들어서 인덱스0부터 끝까지 while문 돌린거다.
	while( $db_row = mysqli_fetch_array($db_result) ){
    
    	//이부분이 좀 복잡한데, html문과 섞어써야되서 그렇다. "랑 ' 가 많아서 눈이 아픈데..ㅠㅠ 이렇게 하는 수밖에없다..
		echo '<tr><td>' . $db_row[ 'status' ] . '</td><td> <a href="' . $db_row[ 'linkUrl' ] . '"target="_blank">'. $db_row[ 'title' ] . '</a></td><td>' . $db_row[ 'content' ] . '</td><td>' . $db_row[ 'tag' ] .  '</td><td>' . $db_row[ 'registDate' ] .'</td></tr>';
		
        
        //위에서 선언한 갱신 상품 갯수 ++ 해주기
		global $updatedItemCount;
		$updatedItemCount++;
	}
}

?>

주석에 앵간한 설명 다써놨다.

혹시 잘 이해안가는 부분있으시면 댓글 달아주십쇼

 

결과


 

이렇게 업데이트 될때마다 업뎃된당

728x90
반응형