sql join 쿼리

sql join 쿼리

QA

sql join 쿼리

본문

원하는 결과가 검색이 되어야 하다보니 join 을 이렇게 썼는데요

어찌 하다보니 페이지 열리는 속도가 너무 느린데..

효율적으로 어떻게 수정하면 그냥 빠를까요..~

 


$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 ='' ";

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' ";
}
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' ";
}
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' ";
}

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'];

이 질문에 댓글 쓰기 :

답변 2

b 테이블의 조건을 전체 조건에서 넣지 마시고 left join 할때 미리 넣어 보세요

예를 들어


select mb_id from a
left join b on a.mb_id = b.mb.id 
left join c on a.mb_id = c.mb.id 
where a의 조건들 and b의 조건들

이렇게 하지말고


select mb_id from a
left join (select * from b where b의 조건들) b on a.mb_id = b.mb.id 
left join c on a.mb_id = c.mb.id 
where a의 조건들

이런식으로요

 

근데 쓰지도 않는 c 테이블은 왜 있는건가요?


$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 ='' ";
 
$__is_search = false;
if($depth4) {
    $sql_where .= " and b.it_name like '%한달 4회%' ";
    $__is_search = true;
} else if ($depth2) {
    $sql_where .= " and b.it_name like '%한달 2회%' ";
    $__is_search = true;
}

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)."%' ";
    $__is_search = true;
}
 
if ($__is_search)
    $sql_where .= " and (b.ct_status in ('입금', '준비', '배송') and b.ca_id ='60')  ";

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'];

 

테스트는 안해보서 모르겠구요.

 

데이타가 많아서 그런거라면

테이블을 만들어서 휴지통 형식으로 비워 내는 방법밖에는 없어 보이네요

 

1. 휴지통 방식으로 자동 혹은 수동으로 몇개월 이전 주문내역은 다른 테이블로 이동 시킬수 있는 관리 페이지를 만든다. 단, 관리자나 이용자나 주문내역을 홈페이지에서 검색할 수 있어야 한다. 주문이 많다면 년도별로 테이블을 만들어야 될것 같습니다.

 

2. 몇개월 주문내역은 검색이 불가능합니다. 라고 이용자에게 안내하고, 몇개월 이전 주문 내역을 삭제해주는 방법도 있구요. 이것도 자동으로 하거나 관리자 페이지에서 정리 버튼을 클릭하면 삭제하는 방식으로 해야 되구요.

답변을 작성하시기 전에 로그인 해주세요.
전체 219
QA 내용 검색

회원로그인

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