두 게시판의 조회수순으로 latest 만들기

질문을 올렸었는데 삭제가 된것 같네요.
갤러리 게시판을 2개 사용하여 여기서 조회수 높은 글을 가져와 최신글 형식처럼
보여 주려합니다.
 
일단 두 게시판의 내용을 latest.lip.php의 함수의 쿼리를 Union 으로 변경,
내용을 약간 수정하여 만들려 합니다.
 
쿼리 내용은 정상적으로 불러오는 것 같은데, latest에서 list 형식으로 뿌려주는
get_list 함수에서 하나의 보드($board)만 입력 받아 처리가 되어 latest의 링크가
하나의 보드로만 지정되어 링크가 됩니다.
물론 이미지도 그렇게 불러오는 것 같습니다.
 
DB 테이블은 charge, nocharge 두개의 테이블이며
가져오는 아이디 값(wr_id)은 charge에서 1, nocharge에서 14, 15, 16, 17 이렇게
총 5개의 값을 가져 옵니다.
그러나 링크 값은 charge 1, 14 ,15 16, 17로 링크가 됩니다.
 
하나의 게시판을 두가지 분류로 나누어 사용해도 되나, head 인클루드가 서로
다른 파일이고, 관리의 편의 및 확장성을 주기 위해 latest 함수를 고치기로
하였는데, 잘 안되네요.
 
latest 함수를 잘 수정하면 될 듯한데, 능력 부족으로 헤메고 있습니다.
 
고수님들의 답변을 부탁드립니다.
 
수정 latest 함수----------------------------------------------------------------
function latestImg($skin_dir="", $bo_table01, $bo_table02, $rows=10, $subject_len=40, $options="") // 보드명 2개를 인자로 받고 option으로 조회수(wr_hit) 등으로 확장성을 주었음
{
    global $g4;
    if ($skin_dir)
        $latest_skin_path = "$g4[path]/skin/latest/$skin_dir";
    else
        $latest_skin_path = "$g4[path]/skin/latest/basic";
    $list = array();
    $sql = " select * from $g4[board_table] where bo_table = '$bo_table01' OR bo_table = '$bo_table02'";
    $board = sql_fetch($sql);
    $tmp_write_table01 = $g4['write_prefix'] . $bo_table01; // 첫번째 게시판 테이블 전체이름
    $tmp_write_table02 = $g4['write_prefix'] . $bo_table02; // 두번째 게시판 테이블 전체이름
    $sql = "SELECT * FROM $tmp_write_table01 UNION ALL SELECT * FROM $tmp_write_table02 ORDER BY $options DESC LIMIT 0, $rows";
    //explain($sql);
    $result = sql_query($sql);
    for ($i=0; $row = sql_fetch_array($result); $i++)
        $list[$i] = get_list($row, $board, $latest_skin_path, $subject_len); // 보드 하나만 지정하여 값을 넘김
        usort( $list, 'hitcmp');
    ob_start();
    include "$latest_skin_path/latest.skin.php";
    $content = ob_get_contents();
    ob_end_clean();
    return $content;
}
function hitcmp( $a, $b) {
    return intval( $b) - intval( $a); // DESC
}
 
해결 방법이 있을가요???
|

댓글 9개

http://sir.co.kr/bbs/tb.php/g4_qa/25536
다시 해 보세요.
답변 주셔서 감사합니다.
UNION 구문에 문제는 없는 것으로 보입니다.
rolo 님께서 알려주신 UNION 구문에 첫번째 Order by가 오류가 나서 찾아보니 Union 구문 사용시 Order by 는 한번만 쓰이는 것을 알게 되어 해당 구문을 삭제후 문제 없이 값을 가져 오는 것을 확인 했으나,
문제는 보드명에 가져온 값의 글 아이디와 매치시키는 부분인데, get_list 함수에서 하나의 보드만 가져온다는 것입니다.

get_list 에서 $board 가 배열로 넘어가 해당 아이디와 매치를 해야 하는데, 이 부분이 안되는 것 같습니다.
get_list 함수 혹은 다른 코드 변경으로 매치 시키는 방법을 찾고 있습니다.
일단 요렇게 한번 해보세요...

$sql = "SELECT * FROM $tmp_write_table01 UNION ALL SELECT * FROM $tmp_write_table02 ORDER BY $options DESC LIMIT 0, $rows";

||
V
$sql = "select * from $tmp_write_table01 union all select * from $tmp_write_table02 order by wr_hit desc limit 0,10";
$result = sql_query($sql);

그 담에...
좋은 방법이.. 떠오르지 않네요...
스킨에서..

<?
echo $list[$i][icon_reply] . " ";
#####################################################
// join을 하지않고...
// union all로 distinct 를 안하는 스타일로 게시판을 통합해서 쿼리를 하고
// get_list함수를 이용하려면 wr_id,wr_hit,wr_subject 를 기준으로
// 두 테이블중에 하나에서 쿼리하고 없으면 다른 테이블로 링크를 줘야만 될듯합니다.
// 각각의 테이블이 테이블명을 가지고 있지 않기때문에 {$list[$i][href]} 에서 쿼리된
// 결과를 링크할때 무조건 $bo_table 로 하기에.. 최선아니면 차선이죠..
// 제목까지 잘랐으니 거의 올바른 경로가 될지..싶은데..
// 2006.06.19 dalsoo.

$this_id=""; $this_id_name=""; $sub_before_cut="";
$sub_length=strlen($list[$i][subject]);
$sub_before_cut=trim(substr($list[$i][subject],0,$sub_length-4));
$this_id=
@mysql_result(@mysql_query("select wr_id,wr_hit, wr_subject from $tmp_write_table01 where "
."(wr_subject like '$sub_before_cut%' and wr_id='{$list[$i][wr_id]}' and wr_hit='{$list[$i][wr_hit]}' "
."and wr_is_comment=0)"),0,0);
//두번째 테이블에 제목+조회수+글번호가 일치하지 않으면 링크는 첫번째테이블이다.
if($this_id !="")$list[$i][href]=str_replace("$bo_table02","$bo_table01",$list[$i][href]);
//게시판:제목
$this_ql="select bo_subject,bo_table from g4_board where bo_table ";
if($this_id !="") $bo_table="$bo_table01"; else $bo_table="$bo_table02";
$this_id_name=@mysql_result(@mysql_query("$this_ql= '$bo_table'"),0,0);
echo "[<a href='{$list[$i][href]}'><font color='green'>$this_id_name</font></a>] &nbsp;<a href='{$list[$i][href]}'>";

if ($list[$i][is_notice])
.
.
(이하동일)
우선 수정해 주세요.

function hitcmp( $a, $b) {
return intval( $b['wr_hit']) - intval( $a['wr_hit']); // DESC
}
UNION과 order by에서 hit로 정열해 주니 usort()는 필요 없겠네요.
단지 query문을 조금 수정해서 $list에 bo_table이 들어 가도록 해야겠습니다.

$sql = "SELECT *, $bo_table1 bo_taable FROM $tmp_write_table01 UNION ALL SELECT *, $bo_table1 bo_taable FROM $tmp_write_table02 ORDER BY $options DESC LIMIT 0, $rows";

bo_table 을 추가하고, get_list 파라미터를 수정하면

$list[$i] = get_list($row, $list['bo_table'], $latest_skin_path, $subject_len);
달수님, rolo님 답변 감사합니다.
rolo님 제가 잘 몰라서 그러는데 쿼리문이 조금 이상한거 같습니다.

말씁하신대로 쿼리에서 테이블 명을 가져오면 될 것 같은데 가져오는 방법을 모르겠습니다.
Select 다음에 $bo_atable1 bo_table로 되어 있는데, 이게 컬럼명 불러오는거 아닌가요?

실력이 안되서 계속 질문을 드리게 되어 죄송합니다.
또 오타군요. 컨디션이 안 좋은가 봅니다.

SELECT *, '$bo_table1' bo_table FROM $tmp_write_table01

SELECT A.*, '$bo_table1' bo_table FROM $tmp_write_table01 A UNION ...

뒤쪽 select도 수정해 주세요.
rolo님 답변 감사합니다.
조금만 더하면 잘 작동하겠네요 ^^

보드값이 6자로 한정되고, get_list에서 $row['bo_table'] 로 넘기니 에러가 나네요
이제 조금 시간적 여유가 나니, 제가 한번 잡아보겠습니다.

계속 답변 주셔서 감사합니다.

달수님 것은 차선책으로 생각했었는데, 지금 사용하는게 아무래도 잘 될거 같네요..
달수님의 답변에도 감사드립니다.
댓글을 작성하시려면 로그인이 필요합니다. 로그인

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기 기존 게시물은 열람만 가능합니다.

+
제목 글쓴이 날짜 조회
19년 전 조회 1,514
19년 전 조회 1,460
19년 전 조회 1,429
19년 전 조회 1,438
19년 전 조회 2,910
19년 전 조회 1,431
19년 전 조회 1,531
19년 전 조회 1,612
19년 전 조회 1,197
19년 전 조회 2,018
19년 전 조회 1,514
19년 전 조회 1,285
19년 전 조회 1,536
19년 전 조회 1,511
19년 전 조회 1,512
19년 전 조회 1,527
19년 전 조회 1,568
19년 전 조회 1,559
19년 전 조회 1,533
19년 전 조회 1,570
🐛 버그신고