두 게시판의 조회수순으로 latest 만들기 > 그누4 질문답변

그누4 질문답변

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

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

두 게시판의 조회수순으로 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
}
 
해결 방법이 있을가요???

댓글 전체

답변 주셔서 감사합니다.
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])
.
.
(이하동일)
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'] 로 넘기니 에러가 나네요
이제 조금 시간적 여유가 나니, 제가 한번 잡아보겠습니다.

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

달수님 것은 차선책으로 생각했었는데, 지금 사용하는게 아무래도 잘 될거 같네요..
달수님의 답변에도 감사드립니다.
전체 66,554 |RSS
그누4 질문답변 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT