sql join 쿼리 채택완료
웹프리죤
5년 전
조회 2,540
원하는 결과가 검색이 되어야 하다보니 join 을 이렇게 썼는데요
어찌 하다보니 페이지 열리는 속도가 너무 느린데..
효율적으로 어떻게 수정하면 그냥 빠를까요..~
</p>
<p>$sql_common = " from {$g5['member_table']} a left join {$g5['g5_shop_cart_table']} b on (a.mb_id = b.mb_id) left join {$g5['g5_shop_order_table']} c on (a.mb_id = b.mb_id) ";
$sql_where = " where a.mb_id <> '{$config['cf_admin']}' and a.mb_leave_date = '' and a.mb_intercept_date ='' ";</p>
<p>
if($depth4){
$sql_where .= " and b.it_name like '%한달 4회%' and (b.ct_status = '입금' or b.ct_status = '준비' or b.ct_status = '배송') and b.ca_id ='60' ";
}</p>
<p>if($depth2){
$sql_where .= " and b.it_name like '%한달 2회%' and (b.ct_status = '입금' or b.ct_status = '준비' or b.ct_status = '배송') and b.ca_id ='60' ";
}</p>
<p>if($mb_name){
$mb_name = preg_replace('/\!\?\*$#<>()\[\]\{\}/i', '', strip_tags($mb_name));
$sql_where .= " and a.mb_name like '%".sql_real_escape_string($mb_name)."%' and (b.ct_status = '입금' or b.ct_status = '준비' or b.ct_status = '배송') and b.ca_id ='60' ";
}</p>
<p>
if ($sort1 == "") $sort1 = "a.mb_id";
if ($sort2 == "") $sort2 = "desc";</p>
<p>$summaryQuery = " select a.mb_id, a.mb_name, b.it_name, b.od_id ".$sql_common." ".$sql_where." group by a.mb_id order by ".$sort1.' '.$sort2;
$countQuery = 'select count(*) as cnt from ('.$summaryQuery.') summary';
$row = sql_fetch($countQuery);
$total_count = $row['cnt'];</p>
<p>
댓글을 작성하려면 로그인이 필요합니다.
답변 2개
채택된 답변
+20 포인트
5년 전
b 테이블의 조건을 전체 조건에서 넣지 마시고 left join 할때 미리 넣어 보세요
예를 들어
</p>
<p>select mb_id from a</p>
<p>left join b on a.mb_id = b.mb.id </p>
<p>left join c on a.mb_id = c.mb.id </p>
<p>where a의 조건들 and b의 조건들</p>
<p>
이렇게 하지말고
</p>
<p>select mb_id from a</p>
<p>left join (select * from b where b의 조건들) b on a.mb_id = b.mb.id </p>
<p>left join c on a.mb_id = c.mb.id </p>
<p>where a의 조건들</p>
<p>
이런식으로요
근데 쓰지도 않는 c 테이블은 왜 있는건가요?
로그인 후 평가할 수 있습니다
댓글을 작성하려면 로그인이 필요합니다.
5년 전
</p>
<p>$sql_common = " from {$g5['member_table']} a left join {$g5['g5_shop_cart_table']} b on (a.mb_id = b.mb_id) left join {$g5['g5_shop_order_table']} c on (a.mb_id = b.mb_id) ";
$sql_where = " where a.mb_id <> '{$config['cf_admin']}' and a.mb_leave_date = '' and a.mb_intercept_date ='' ";</p>
<p> </p>
<p>$__is_search = false;
if($depth4) {
$sql_where .= " and b.it_name like '%한달 4회%' ";</p>
<p> $__is_search = true;
} else if ($depth2) {
$sql_where .= " and b.it_name like '%한달 2회%' ";</p>
<p> $__is_search = true;</p>
<p>}</p>
<p>
if($mb_name){
$mb_name = preg_replace('/\!\?\*$#<>()\[\]\{\}/i', '', strip_tags($mb_name));
$sql_where .= " and a.mb_name like '%".sql_real_escape_string($mb_name)."%' ";</p>
<p> $__is_search = true;
}</p>
<p> </p>
<p>if ($__is_search)</p>
<p> $sql_where .= " and (b.ct_status in ('입금', '준비', '배송') and b.ca_id ='60') ";</p>
<p>
if ($sort1 == "") $sort1 = "a.mb_id";
if ($sort2 == "") $sort2 = "desc";
$summaryQuery = " select a.mb_id, a.mb_name, b.it_name, b.od_id ".$sql_common." ".$sql_where." group by a.mb_id order by ".$sort1.' '.$sort2;
$countQuery = 'select count(*) as cnt from ('.$summaryQuery.') summary';
$row = sql_fetch($countQuery);
$total_count = $row['cnt'];</p>
<p>
테스트는 안해보서 모르겠구요.
데이타가 많아서 그런거라면
테이블을 만들어서 휴지통 형식으로 비워 내는 방법밖에는 없어 보이네요
1. 휴지통 방식으로 자동 혹은 수동으로 몇개월 이전 주문내역은 다른 테이블로 이동 시킬수 있는 관리 페이지를 만든다. 단, 관리자나 이용자나 주문내역을 홈페이지에서 검색할 수 있어야 한다. 주문이 많다면 년도별로 테이블을 만들어야 될것 같습니다.
2. 몇개월 주문내역은 검색이 불가능합니다. 라고 이용자에게 안내하고, 몇개월 이전 주문 내역을 삭제해주는 방법도 있구요. 이것도 자동으로 하거나 관리자 페이지에서 정리 버튼을 클릭하면 삭제하는 방식으로 해야 되구요.
로그인 후 평가할 수 있습니다
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인