union 을 이용한 두개의 테이블에서 최신글을 한번에 뽑는 팁.. 2탄 > 그누4 팁자료실

그누4 팁자료실

그누보드4와 관련된 팁을 여러분들과 함께 공유하세요.
나누면 즐거움이 커집니다.

union 을 이용한 두개의 테이블에서 최신글을 한번에 뽑는 팁.. 2탄 정보

union 을 이용한 두개의 테이블에서 최신글을 한번에 뽑는 팁.. 2탄

본문

헛~ 한발 늦었군요.
달수님께서 먼저 올리셨네요 ㅠ.ㅠ

'질문답변'란에 이 질문을 올렸는데, 오달수님과 rolo님이 답변을 주신 것중
rolo님의 답변이 빠르고 쉬울거 같아서 오달수님의 코드와 다른 방법으로 만들었습니다.
(실은 오달수님의 코드가 제겐 어려워 보여서.. 실은 잘 몰랐습니다. ㅠ.ㅠ)

두개의 게시판에서 원하는 필드로 정렬하여 뽑는 글입니다.
정렬방법에 따라 최신글(wr_datetime), 조회수(wr_hit), 추천수(wr_good), 비추천수(wr_nogood), 여분필드 등으로 정렬이 가능하며, 약간의 코드만 수정하면, 세개 이상의 게시판 글을 가져올 수 있습니다.

첫번째로 lib/latest.lib.skin.php 제일 하단에 아래 함수를 추가합니다.

function latestUnion($skin_dir="", $bo_table01, $bo_table02, $rows=10, $subject_len=40, $options="")
{
global $g4;

if ($skin_dir)
$latest_skin_path = "$g4[path]/skin/latest/$skin_dir";
else
$latest_skin_path = "$g4[path]/skin/latest/basic";

if (strlen($bo_table01) > strlen($bo_table02)){ //게시판명이 긴 것이 앞으로(쿼리시 먼저 나오는 bo_table명의 길이가 뒤 bo_table명의 길이에 영향)
$tmp_bo_table01 = $bo_table01;
$tmp_bo_table02 = $bo_table02;
$tmp_write_table01 = $g4['write_prefix'] . $bo_table01; // 첫번째 게시판 테이블 전체이름
$tmp_write_table02 = $g4['write_prefix'] . $bo_table02; // 두번째 게시판 테이블 전체이름
} else {
$tmp_bo_table01 = $bo_table02;
$tmp_bo_table02 = $bo_table01;
$tmp_write_table01 = $g4['write_prefix'] . $bo_table02; // 첫번째 게시판 테이블 전체이름
$tmp_write_table02 = $g4['write_prefix'] . $bo_table01; // 두번째 게시판 테이블 전체이름
}

$sql = "SELECT A.*, '$tmp_bo_table01' bo_table  FROM $tmp_write_table01 A UNION ALL SELECT B.*, '$tmp_bo_table02' bo_table  FROM $tmp_write_table02 B ORDER BY $options DESC LIMIT 0, $rows";
//explain($sql);
$result = sql_query($sql);

for ($i=0; $row = sql_fetch_array($result); $i++){
$sql = " select * from $g4[board_table] where bo_table = '$row[bo_table]'";//해당 게시판 정보 가져옴
$board = sql_fetch($sql);
$list[$i] = get_list($row, $board, $latest_skin_path, $subject_len);
}

ob_start();
include "$latest_skin_path/latest.skin.php";
$content = ob_get_contents();
ob_end_clean();

return $content;
}



두번째로 원하시는 latest의 스킨을 받으신 후, 받으신 스킨의 latest.skin.php에서 아래와 같이 수정

<? for($i=0; $i<count($list); $i++) {$m++;
$file_name = get_thumb_filename2($list[$i][wr_id], 0);
를 아래 코드와 같이 삽입

<? for($i=0; $i<count($list); $i++) {$m++;
$path_table = $list[$i]['bo_table'];// 게시판별 패스지정을 위한 변수(테이블명)
$file_name = get_thumb_filename2($list[$i][wr_id], 0);

$bo_table이 사용된 곳이 두군데 있는데 이를 $path_table로 수정
$file = "$g4[path]/data/file/$bo_table/".$list[$i][file][0][file]; 를
$file = "$g4[path]/data/file/$path_table/".$list[$i][file][0][file]; 로 수정

if($i==0) @exec("rm ".dirname($_SERVER[SCRIPT_FILENAME])."$g4[path]/data/file/$bo_table/*reportThumb -rf"); 를
if($i==0) @exec("rm ".dirname($_SERVER[SCRIPT_FILENAME])."$g4[path]/data/file/$path_table/*reportThumb -rf"); 로 수정

대부분의 latest 스킨파일 상단에 게시판으로 가는 링크들이 있는데 이는 삭제해야 될 것 같네요..
사용용도에 따라 링크를 삭제 혹은 하나의 게시판으로 링크를 걸면 되겠네요.


세번째로 latest list가 들어가야 하는 곳의 코드는 아래와 같이 넣어 주면 됩니다.

<? echo latestUnion("스킨명", "첫번째 테이블명", "두번째 테이블명", 가져올 리스트 수, 제목길이, "옵션"); ?>

예) <? echo latestImg("new_img", "charge", "nocharge", 5, 20, "wr_datetime"); ?>
위에 예는 charge, nocharge라는 두개의 테이블에서 5개의 리스트를 가져오며, 20글자의 제목 제한을
갖고, 최근에 작성한 글을 기준으로 정렬합니다.

마지막 옵션에 들어가는 것은 wr_hit는 조회수, wr_good은 추천수, wr_1은 여분필드1 등등 여러개가
들어갈 수 있습니다.
필요하신 것으로 정렬하시면 될듯하네요..

이것 만드는데 도와주신 rolo님,, 사용은 못했지만 고생하여 주신 오달수님께 감사드립니다.

초보가 만드는데 고생 좀 했습니다. ^^:

여러분의 추천한방이 팁란을 풍성하게 만듭니다.
추천
1
  • 복사

댓글 8개

넵 링크도 문제였습니다.. ^^
링크부분은 보드 배열을 가지고 오는 곳과, 이미지 나타내는 부분 약간 수정하니 모두 제대로 작동하네요..

달수님께서 고생하셨는데 제겐 넘 어려운 코드라.. 죄송

그나마 달수님께서 답변을 주시어 작업하는게 안되면 달수님꺼 쓸수 있다는 생각에 맘 편히 작업에 임했습니다. ^^
좋은 팁 감사합니다. 그런데 궁금한 것이 있습니다. 만약 UNION ALL 방법을 통해서 a의 내용을 b에서 count를 세고 싶은데......질문이 너무 난해하군요......

쉽게 설명을 하자면...
게시판의 글이 등록이 되어져 있고 각 게시글에 이미지 들이 등록되어져 있는데
게시판 카테고리로 구분하여 파일의 갯수도 구할 수 있나요?
열정님 질문이 잘 이해가 안가네요..
처음 질문은 UNION ALL을 사용하는 쿼리에서 첫번째 게시판에서 가져온 글의 갯수를 두번째 게시판의 글을 가져오는 쿼리에 사용한다는 것인게 맞는지..

이럴 경우 첫번째 쿼리만 주고 거기서 나온 값에 카운트를 변수처리하여 UNION ALL 쿼리에 사용하는 방법이 있는데
쿼리가 두번 날라가네요... (전문가가 아니라서..)

두번째 질문은 Latest 리스트에서 가져오는 모든 게시물(UNION ALL 쿼리의 결과값)에서 첫번째 게시판과 두번째 게시판의 갯수를 가져올 수 있는지에 대한 내용인게 맞나요?

이럴 경우 $row['bo_table']과 $bo_table01, $bo_table02를 제어문으로 비교하여 카운트를 셀 수 있을 것 같은데..

제가 전문가가 아니라서 정확한 쿼리문을 못드리겠네요..
방법만 알면 고생은 되지만 해결이 될 수 있을거 같네요..

정확한 내용을 알려주시면 함 고생해 볼께요 ~~ (실력이 없는 터라 믿지는 마시길..^^;)
답변 감사합니다. 제가 잘 몰라서 하는 질문이다보니 질문이 너무 어설펐어요..
left join을 사용했을 경우에는 where에 원하는 값을 받아서 카운터값을 얻을 수 있더군요...
그런데 위의 유니온 올을 사용하여서도 가능한 것인지 궁금해서요...
넘 신경 쓰지 마세요.... 생소한 접근이어서 궁금한 것 뿐입니다....^^;;
저보다 많이 아시는것 같네요~~ ^^;
WHERE 문에서 가져올수 있다면 가능하겠네요..
UNION ALL의 경우 WHERE문은 따로 사용이 가능하고, ORDER BY만 하나의 구문에 통합되어 사용되는 것 같습니다.

아직 초보라 많은 것을 헤메고 있습니다. ^^;
© SIRSOFT
현재 페이지 제일 처음으로