개발 Q&A

제목 mysql select 질문이요. (어제꺼 이어서요..)
글쓴이 작성시각 2013/11/28 18:39:32
댓글 : 8 추천 : 0 스크랩 : 0 조회수 : 14079   RSS
 안녕하세요.
어제 select 질문 오려서 웅파님 답변을 토대로 새로 
상품테이블 상품 키워드 매칭 테이블 키워드테이블 이런구조로 만들었습니다.
그런데, 문제가 발생해서요...
상품테이블에서 레프트 조인으로 매칭테이블을 가져오고
pd_no | pd_kw_no
28        | 10
28        | 12
28        | 13
29        | 12
29        | 13

매칭 테이블엔 이런 데이터가 들어가 있습니다.

이때 키워드가 12,13이 들어있는 상품을 검색하고 싶어서

if($keyword){
    $inkey = array();
    foreach($keyword as $v){
        $inkey[] = "'{$v}'";
    }
    $where[] = "b.pd_kw_no IN(".implode(",",$inkey).")";
    /*foreach($keyword as $v){
        $inkey[] = 'b.pd_kw_no = "'.$v.'"';
    }
    $inkey = implode(" AND ",$inkey);
    $where[] = "(".$inkey.")";*/
    unset($inkey);
}
생략 ....

$_where = '';
if(count($where)>0){
    $_where .= " WHERE ";
    $_where .= implode(' AND ',$where);
    unset($where);
}


생략 ...

만든 최종 쿼리 구문..
SELECT a.* FROM `mo_product` AS a LEFT JOIN `mo_pd_kw_match` AS b ON a.pd_no = b.pd_no 
$_where GROUP BY a.pd_no order by a.pd_no
이런 php스크립트를 작성했습니다.

만약 키워드가 10,12,13이 들어있는 상품을 검색하게되면 28,29의 상품이 검색되는데요..

제가 원하는 결과는 10,12,13을 검색하면 28의 상품만 검색이 되야 하거든요..

그래서 in문 말고 and로 묶으면 되지 않을까 해서 위 소스의 주석친
 
    foreach($keyword as $v){
        $inkey[] = 'b.pd_kw_no = "'.$v.'"';
    }
    $inkey = implode(" AND ",$inkey);
    $where[] = "(".$inkey.")";


 이부분으로 변경을 해 보니 검색결과가 없더라고요.

원인은 레프트 조인을 하게 되면 로우가 늘잖아요 .. 이 로우가 느는걸 열로 늘려야 하나요 ??

그럼 열로 늘리는 방법은 어떻게 해야할까요?
 
 다음글 event bind 중복으로 인한 메모리 누수 문제 (2)
 이전글 ERR_EMPTY_RESPONSE 에러에 대해 (1)

댓글

한대승(불의회상) / 2013/11/28 19:27:11 / 추천 0
group by 와 having을 쓰면 원하는 결과를 얻을 수 있을것 같은데요 ^^
/ 2013/11/28 19:45:22 / 추천 0
해빙 검색해 볼게요 감사합니다 ^^
변종원(웅파) / 2013/11/28 23:38:43 / 추천 0
where column in (10,12,13)
/ 2013/11/29 09:51:51 / 추천 0
 
SELECT 
  a.pd_no, b.pd_kw_no 
FROM 
 `mo_product` AS a 
 LEFT JOIN `mo_pd_kw_match` AS b 
  ON a.pd_no = b.pd_no
GROUP BY b.pd_no 
HAVING b.pd_kw_no IN('10','12','13')

해빙 젹용해 봤는데 결과가 똑같네요 .. otl...   TT_TT
/ 2013/11/29 09:58:13 / 추천 0
 매칭테이블에 데이터가 
pd_no | pd_kw_no
28        | 10
28        | 12
28        | 13
29        | 12
29        | 13

이렇게 되어있는데

pd_no | pd_kw_no
28        | 10,12,13
29        | 12,13
이렇게 가져올 수 있나요 ?
어렵네요 ... 

아래와같이 새로 저장해야 할까요 ? ;;

한대승(불의회상) / 2013/11/29 10:04:34 / 추천 0
SELECT 
  a.pd_no
FROM
  `mo_product` AS a 
  LEFT JOIN `mo_pd_kw_match` AS b 
    ON a.pd_no = b.pd_no 
WHERE b.pd_kw_no IN ('10', '12', '13')
GROUP BY b.pd_no 
HAVING COUNT(*) = 3

/ 2013/11/29 11:19:42 / 추천 0
불의회상 //
답변 감사합니다. ^^
이때 카운트 3은 3개를 다 포함하고 있다는 건가요 ??
그럼 '10''12''13', '14' 
카운트 4인가요 ?? 허접해서 죄송합니다 .. ㅠ_ㅠ;;
한대승(불의회상) / 2013/11/29 11:42:09 / 추천 0
닉// 넵 맞습니다.