그누보드 여러 게시판에서 글 추출 후 정렬하는 쿼리
MySQL에서는 union 이라는 함수가 있다. select 쿼리문의 결과를 하나의 결과로 묶을 수가 있다.
이 union을 이용해서 공개게시판으로 많이 사용되는 그누보드에서 여러 게시판의 글을 추출한 후
특정 필드로 정렬해서 보여주는 것을 만들어보고자 한다.
우선 게시판 테이블명을 g4_write_aaa, g4_write_bbb 라고 가정한다. 그누보드에서는 게시판에 접근하기 위해
bo_table 이라는 것을 사용하는데 여기서는 aaa와 bbb가 각 게시판의 bo_table 값이 된다.
aaa 게시판에서 최근에 등록된 5개의 글을 가져오는 쿼리는 아래와 같다. 기본적으로 wr_id, wr_subject, wr_datetime 필드 정보만 가져오는 것으로 한다. 필요하다면 필드명을 추가해주면 된다.
$sql = ” select ‘aaa’ as bo_table, wr_id, wr_subject, wr_datetime
from `g4_write_aaa`
where wr_is_comment = ‘0’
order by wr_num asc
limit 0, 5 “;
위 쿼리에서 ‘aaa’ as bo_table 이란 부분은 존재하지 않는 bo_table 필드의 값을 aaa 라고 지정해주는 것이다.
그누보드에서는 bo_table 값이 있어야 게시판에 접근할 수 있으므로 여러 개의 게시판에서 글을 추출하는 것이라면
반드시 필요한 것이다. 하나라면 없어도 되는 부분이다. bbb 게시판에 대해서도 위 처럼 하면된다.
그럼 이제 두개의 쿼리 결과를 하나로 합쳐야 한다. 이 때 사용하는 것이 union 이다.
$sql = ” ( select ‘aaa’ as bo_table, wr_id, wr_subject, wr_datetime
from `g4_write_aaa`
where wr_is_comment = ‘0’
order by wr_num asc
limit 0, 5 )
UNION ALL
( select ‘bbb’ as bo_table, wr_id, wr_subject, wr_datetime
from `g4_write_bbb`
where wr_is_comment = ‘0’
order by wr_num asc
limit 0, 5 )
order by wr_datetime desc
limit 0, 5 “;
위처럼 쿼리를 작성하면 두 개의 select 결과가 하나의 결과로 합쳐지게 된다. 위의 결과는 aaa와 bbb에서 최근
등록순으로 각 5개의 글을 추출하고 이것을 합쳐서 다시 최근등록순으로 5개의 글을 추출하는 것이다. 즉 aaa와
bbb 두 개의 게시판에서 최신등록글 5개를 추출하는 것이다. 이 결과를 이용해서 최근글을 보여주면 된다.
아래는 간단히 php 파일을 만들어서 쿼리 결과를 보여주는 것이다. 그누보드가 설치된 상태에서 사용할 수 있다.
<?php
include_once(‘./_common.php’);
include_once($g4[‘path’].’/head.sub.php’);$sql = ” ( select ‘test1’ as bo_table, wr_id, wr_subject, wr_num, wr_datetime
from `g4_write_test1`where wr_is_comment = ‘0’
order by wr_num asc
limit 0, 5 )
union all
( select ‘test2’ as bo_table, wr_id, wr_subject, wr_num, wr_datetime
from `g4_write_test2`where wr_is_comment = ‘0’
order by wr_num asc
limit 0, 5 )
order by wr_datetime desc
limit 0, 5 “;
$result = sql_query($sql);for($i=0; $row=sql_fetch_array($result); $i++) {
print_r($row);
echo ‘<br />’.”n”;
}include_once($g4[‘path’].’/tail.sub.php’);
?>
참고사항 : UNION과 UNION ALL 의 차이 및 주의 사항