테스트 사이트 - 개발 중인 베타 버전입니다

쿼리문 질문드립니다 채택완료

</p>

<p>$sql = "SELECT *,

             (select count(*) from g5_write_" . $bo_table . " where ca_name = book.wt_idx) as wt_cnt,

             (select max(wr_datetime) from g5_write_" . $bo_table . " where ca_name = book.wt_idx) as wt_last

             FROM bookWHERE bo_table='".$bo_table."'".$where." ORDER BY wt_idx ASC LIMIT ".$wfrom_record.", ".$wpage_rows;</p>

<p>$gresult = sql_query($sql);</p>

<p>

 

이렇게 쿼리를 하면 게시물이 적으면 괜찮은데..게시물이 많아지면 504에러를 뿜어냅니다..어떻게 수정을 해야 부하없이 잘 불러올수 잇을까요? 따로 쿼리문을 빼야할까요?

댓글을 작성하려면 로그인이 필요합니다.

답변 5개

채택된 답변
+20 포인트

우선 눈에 보이는건

FROM bookWHERE

=>

FROM book WHERE 

떨어져야 할거 같은데요

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

복붙하다가 붙어버렸네요..ㅎㅎ;; 저부분을 나눠서 하거나 다르게 수정할수 있는 방법은 없을까요?

댓글을 작성하려면 로그인이 필요합니다.

잘 보니..

g5_write_".$bo_table."ca_name 

 

에서

$bo_table."ca_name 

에 띄어쓰기가 없네요

 

복붙시에 공백이 사라진듯 합니다.

 

다른부분에 쿼리가 정상인지

echo 로 $sql2;

echo $sql3;

찍어서 실행시켜보시면 정확할듯 싶네요

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

$r3date = $r2['datetime']; // bo_table별 최종시간

 

여기를 $r3['datetime']; 으로 변경하셔야 겠네요 

제가 변경을 누락했네요

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

해당 쿼리를 불러오지를 못하고 있습니다..ㅠ_ㅠ 합치면 다 불러오는데 단일로 하면 못 불러오는걸까요?

댓글을 작성하려면 로그인이 필요합니다.

아.. 그렇군요

book 테이블은 

 

g5_board 와 비슷한 기능인가보네요

 

 

</p>

<p><?php</p>

<p> </p>

<p>$sql = "SELECT * FROM book WHERE bo_table='".$bo_table."'".$where." ORDER BY wt_idx ASC LIMIT ".$wfrom_record.", ".$wpage_rows;</p>

<p>$result = sql_query($sql);</p>

<p>while ($book = sql_fetch_array($result) {</p>

<p>    $sql2 = "select count(*) cnt  from g5_write_".$bo_table." ca_name = '".$book['wt_idx']."' ";</p>

<p>    $r2 = sql_fetch($sql2);</p>

<p>    $r2count  = $r2['cnt'];  // row별 카운트 사용</p>

<p>    $sql3 = "select max(wr_datetime) datetime  from g5_write_".$bo_table." ca_name = '".$book['wt_idx']."' ";</p>

<p>    $r3 = sql_fetch($sql2);</p>

<p>    $r3date  = $r2['datetime'];  // bo_table별 최종시간</p>

<p> </p>

<p>   // 필요하신 코드 추가</p>

<p>}</p>

<p>

 

위와 같이 처리하시면 될듯 싶은데요

 

처음에 작성하신 방법대로 하면 

카운트와 max값을 구하면서 Row를 긁어올때 

과도한 부하가 걸립니다.

개별로 처리하시는게 더 깔끔하고 빠르게 처리됩니다.

 

 

 

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

플래토님이 알려주신 방법으로 한번해보고 잘안되면 다시 여쭈어보겠습니다^^
[code]
$sql = "SELECT count(*) as cnt FROM book WHERE bo_table='".$bo_table."'".$where;
$rs = sql_fetch($sql);
$wtotal_count = $rs["cnt"];

$wpage_rows = WT_COVER_CNT;
$wtotal_page = ceil($wtotal_count / $wpage_rows); // 전체 페이지 계산

$wfrom_record = ($wpage - 1) * $wpage_rows; // 시작 열을 구함

$sql = "SELECT * FROM book WHERE bo_table='".$bo_table."'".$where." ORDER BY wt_idx ASC LIMIT ".$wfrom_record.", ".$wpage_rows;

$gresult = sql_query($sql);

while ($book = sql_fetch_array($gresult) {
$sql2 = "select count(*) cnt from g5_write_".$bo_table."ca_name = '".$book['wt_idx']."' ";
$r2 = sql_fetch($sql2);
$r2count = $r2['cnt']; // row별 카운트 사용
$sql3= "select max(wr_datetime) datetime from g5_write_".$bo_table."ca_name = '".$book['wt_idx']."' ";
$r3= sql_fetch($sql2);
$r3date = $r2['datetime']; // bo_table별 최종시간

// 필요하신 코드 추가
}

$glist = array();
[/code]

이렇게 적용하니 적용이 안됩니다..어디가 잘못되었을까요ㅠ?

댓글을 작성하려면 로그인이 필요합니다.

게시물이 많아질때 다르게 해야 하는 조검이 명확하지 않은데

어떤걸 다르게 표현하려고 하시는건가요?

 

막연히 게시물이 많아서 504 에러가 난다 라고하시면

게시물이 적을땐 안난다는건데

문제의 원인이   쿼리만 볼때 문제를 말씀드리는거라면

 

select * from 테이블 하는 시점에

모든게시물 의 조건일경우

그 안에 서브쿼리가 또 selec count(*) from 테이블 과

select max(column) from 테이블을 수행하는것 자체가 문제 있습니다.

 

$where 의 내용에 따라 index를 주거나 하는 걸 조치해야 할겁니다.

limit 는 가급적 1페이지(수십 row내외)로 유지하는걸 권장하구요

 

많아지면 일단 느려져서 수행성능에 문제가 발생할수있습니다.

 

그외에 쿼리가 아닌 다른요인이 문제인지는 판단이 좀 애매합니다.

 

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 3개

지금 쿼리문이 날짜와 해당게시물 숫자 와 표지 이렇게 3개를 가져오고있습니다 이거를 따로 각각 불러올려고하면 어떻게 수정을 해야하는게 좋을지 좀 가르쳐주십시요..
@Darcy 사용하시려는 내용이
wr_id, wr_datetime , count

이렇게 인가요?

또 그게 단일건인지 멀티(Row)에 해당되는건인지에 따라 좀 다릅니다.
[code]
$sql = "SELECT * FROM book WHERE bo_table='".$bo_table."'".$where." ORDER BY wt_idx ASC LIMIT ".$wfrom_record.", ".$wpage_rows;
[/code]

이게 원본소입니다..거기에 게시물 수와 시간을 추가했는데..원본을 사용하면 부하없이 빠릅니다..그런데
위에 소스처럼 추가하면 부하가 심해서 단일로 각각 불러낼려고 합니다..

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인

전체 질문 목록

🐛 버그신고