/bbs/list.php에서 공지사항 부분의 query를 줄이는 수정을 했어요... 정보
/bbs/list.php에서 공지사항 부분의 query를 줄이는 수정을 했어요...본문
게시판에 공지사항을 여러건 걸어두면 공지사항 갯수만큼 sql_query가 발생하게 됩니다.
그래서, 아래처럼 전체 공지사항을 한번에 query하고, 결과값을 순차로 fetch하게 했습니다.
/bbs/list.php의 87라인 부근입니다.
if (!$sca && !$stx)
{
$arr_notice = split("\n", trim($board[bo_notice]));
$arr_notice_count = count($arr_notice);
if ($arr_notice_count > 0) { // 공지사항이 있는 경우
for ($k=0; $k<count($arr_notice); $k++)
{
if ($k == 0)
$sql_where = " wr_id = '" . $arr_notice[$k] . "' ";
else
$sql_where .= " or wr_id = '" . $arr_notice[$k] . "' ";
}
$sql = " select * from $write_table where $sql_where ";
$result_notice = sql_query($sql);
while ($row_notice = sql_fetch_array($result_notice))
{
if (!$row_notice['wr_id']) continue;
$list[$i] = get_list($row_notice, $board, $board_skin_path, $board[bo_subject_len]);
$list[$i][is_notice] = true;
$i++;
}
}
}
이렇게 수정을 하고 효과를 보는 중 입니다만 sql_query 갯수는 줄어 들게 되었죠...
그런데 문제가 하나 있습니다.
bo_notice에 ... 21 461 123 ... 이렇게 공지사항이 들어 있더라도 나오는 결과값은 db가
검색하는 순서가 됩니다. 421 123 21 ... 이런식으로.
select * from a where wr_id=21 or wr_id=461 or wr_id=123 이렇게 했을 때...
21 461 123의 순서로 결과가 나오게 하려면 어떻게 해야 할까요???
그래서, 아래처럼 전체 공지사항을 한번에 query하고, 결과값을 순차로 fetch하게 했습니다.
/bbs/list.php의 87라인 부근입니다.
if (!$sca && !$stx)
{
$arr_notice = split("\n", trim($board[bo_notice]));
$arr_notice_count = count($arr_notice);
if ($arr_notice_count > 0) { // 공지사항이 있는 경우
for ($k=0; $k<count($arr_notice); $k++)
{
if ($k == 0)
$sql_where = " wr_id = '" . $arr_notice[$k] . "' ";
else
$sql_where .= " or wr_id = '" . $arr_notice[$k] . "' ";
}
$sql = " select * from $write_table where $sql_where ";
$result_notice = sql_query($sql);
while ($row_notice = sql_fetch_array($result_notice))
{
if (!$row_notice['wr_id']) continue;
$list[$i] = get_list($row_notice, $board, $board_skin_path, $board[bo_subject_len]);
$list[$i][is_notice] = true;
$i++;
}
}
}
이렇게 수정을 하고 효과를 보는 중 입니다만 sql_query 갯수는 줄어 들게 되었죠...
그런데 문제가 하나 있습니다.
bo_notice에 ... 21 461 123 ... 이렇게 공지사항이 들어 있더라도 나오는 결과값은 db가
검색하는 순서가 됩니다. 421 123 21 ... 이런식으로.
select * from a where wr_id=21 or wr_id=461 or wr_id=123 이렇게 했을 때...
21 461 123의 순서로 결과가 나오게 하려면 어떻게 해야 할까요???
댓글 전체
우선
wr_id=21 or wr_id=461 or wr_id=123
보다는
wr_id in (21,461,123 )
를 쓰는 것이 간결해 보이고 속도도 아주 쬐금 빠를 겁니다.
그리고 select 순서는
sum을 이용하거나 아니면
case를 이용해서 원하는 순위가 되도록 한 다음 그 값으로 order by하면 되지 않을까요?
wr_id=21 or wr_id=461 or wr_id=123
보다는
wr_id in (21,461,123 )
를 쓰는 것이 간결해 보이고 속도도 아주 쬐금 빠를 겁니다.
그리고 select 순서는
sum을 이용하거나 아니면
case를 이용해서 원하는 순위가 되도록 한 다음 그 값으로 order by하면 되지 않을까요?
select wr_id from g4_write_SOME ignore index (primary, wr_is_comment, wr_num_reply_parent) where wr_id in (21,461,123 ) ;
한번 해 보세요.
한번 해 보세요.
감사합니다. 푸름아빠님께서 해결해 주셨어요. select case를 이용해서 공지사항을 별도로
select 하지 않고, 본문 select 할 때 한번에 같이 하게 했답니다. 덕분에 쿼리가 팍~ 줄었어요.
select 하지 않고, 본문 select 할 때 한번에 같이 하게 했답니다. 덕분에 쿼리가 팍~ 줄었어요.
union을 이용하지 않고
단순히 case만 쓰면
공지 사항 wr_id에 해당하는 row는 한 번만 나오지 않나요?
단순히 case만 쓰면
공지 사항 wr_id에 해당하는 row는 한 번만 나오지 않나요?
푸름아빠"님 방법도 소개해 주세요.