간단한 JOIN 문 입니다 좀 막히는 부분이 있어서 질문드립니다.
우선 dgc_edu_trade_1_0 와 dgc_edu_trade_product 라는 2개의 테이블이 있습니다.
여기서 JOIN문을 사용해서 dgc_edu_trade_1_0 의 모든 항목 즉 slect * 와
dgc_edu_trade_product 의 product_name 의 데이터를 가져오고 싶습니다
보시면 아시겠지만 두 테이블 모두 no 값이 PK 입니다.
하지만 두 테이블간의 no 값은 전혀 상관 없는 값입니다.
(제가 알기로는 두 테이블간의 전혀 상관없는 칼럼들을 가지고 join 을 하려면 외부조인이라고 알고있습니다만.)
그래서 outer join 을 사용해서 제가 위에 설명 드린것 처럼 값을 뽑아 내고 싶은데
어찌 해야 할지 잘 모르겠습니다 자꾸만 한쪽 테이블의 값만 가져오는데
어렵네요 ㅠㅠ
혹 outer 조인이 아니라 다른 방법을 써야할지 아니면 코드가 틀린것인지 좀 알고 싶습니다.
고수님들 부탁드립니다.
모델단 소스입니다.
function main_list($item,$encode_value){
$decode_value = urldecode($encode_value);
$this->db->select("a.*","b.product_name");
$this->db->from("dgc_edu_trade_1_0 a");
$this->db->order_by("no", "desc");
$this->db->join("dgc_edu_trade_product b","b.no = a.no","left");
if($item){
$this->db->like($item, $decode_value);
}
$result = $this->db->get()->result_array();
echo $this->db->last_query();
//etcOption 처리
foreach($result as $key=>$list){
$result[$key]['etcOption'] = unserialize($list['etc_option']);
}
return $result;
}
IF 문 밑으로는 신경 안쓰셔도 될거 같습니다 LIKE 문과 배열 처리기 때문에 ㅎㅎ
(dgc_edu_trade_1_0 테이블)
(dgc_edu_trade_1_0 테이블 의 값)
(dgc_edu_trade_product 테이블)
(dgc_edu_trade_product 테이블의 값)
제가 작성한 모델단 의 소스를 구동시켜서 출력을 해보면 저렇게 출력이 됩니다 즉
dgc_edu_trade_1_0 테이블의 값만 가져오고
dgc_edu_trade_product 의 product_name 의 값은 읽어 오지 못하고 있습니다.
[1] => Array
(
[no] => 3
[pwd] => 123
[ename] => test
[pname] => 이지용
[num] => 10
[addr] => 서울특별시
[school] => 서울고등학교
[title] => 안녕하세요
[group] =>
[area_group] => 0
[deposit] => 123
[rental] => 333
[list] => 1111
[etc_option] => a:33:{s:4:"name";s:4:"test";s:5:"pname";s:9:"이지용";s:5:"pnum1";s:3:"010";s:5:"pnum2";s:4:"8843";s:5:"pnum3";s:4:"2399";s:4:"num1";s:3:"032";s:4:"num2";s:3:"885";s:4:"num3";s:4:"2398";s:4:"addr";s:15:"서울특별시";s:6:"school";s:18:"서울고등학교";s:5:"title";s:15:"안녕하세요";s:5:"group";s:0:"";s:12:"area_group01";s:0:"";s:12:"area_group02";s:0:"";s:5:"floor";s:3:"123";s:9:"sub_floor";s:3:"123";s:6:"pyeong";s:2:"33";s:10:"sub_pyeong";s:2:"22";s:7:"deposit";s:3:"123";s:6:"rental";s:3:"333";s:8:"p_school";s:1:"1";s:10:"ele_school";s:1:"2";s:10:"mid_school";s:1:"3";s:9:"hi_school";s:1:"4";s:10:"uni_school";s:1:"5";s:5:"sales";s:1:"1";s:6:"profit";s:1:"3";s:7:"radio01";s:3:"무";s:3:"car";s:3:"123";s:7:"premium";s:3:"123";s:4:"list";s:4:"1111";s:3:"pwd";s:3:"123";s:6:"submit";s:6:"확인";}
[reg_date] => 2016-01-19 15:02:14
[etcOption] => Array
(
[name] => test
[pname] => 이지용
[pnum1] => 010
[pnum2] => 8843
[pnum3] => 2399
[num1] => 032
[num2] => 885
[num3] => 2398
[addr] => 서울특별시
[school] => 서울고등학교
[title] => 안녕하세요
[group] =>
[area_group01] =>
[area_group02] =>
[floor] => 123
[sub_floor] => 123
[pyeong] => 33
[sub_pyeong] => 22
[deposit] => 123
[rental] => 333
[p_school] => 1
[ele_school] => 2
[mid_school] => 3
[hi_school] => 4
[uni_school] => 5
[sales] => 1
[profit] => 3
[radio01] => 무
[car] => 123
[premium] => 123
[list] => 1111
[pwd] => 123
[submit] => 확인
)
)
우선 빠른 답변 감사드립니다.
허면 테이블 구조를 저렇게 만해서 사용한다면 join 은 사용 할 수 없는 건지요?
제가 하려는게 아우터 조인인데 그렇다면 no 값만 서로 동일 하다면 정상작동 하는게 맞는건가요?
그렇습니다.
전혀 상관없는 값으로는 조인은 불가능 할 뿐더러, 가져온다 해도 예상과 전혀 다른 값을 가져옵니다.
일단 공통되는 필드가 있어야 조인이 되는지, 유니온이 되는지, 서브쿼리가 되는지 구분이 됩니다.
그런데 전혀 공통된게 없으면 db 할애비가 와도 안됩니다.
재미난 답변이네요 ㅎㅎㅎㅎ
말씀하신데로 두번째 테이블의 no 값을 동일하게 수정하였습니다.
헌데도 에러가 발생하는데 이유가 뭔지 잘 모르겠습니다
여전히 첫번째 테이블의 모든값 (*) 만 출력하고
두번때 테이블의 product_name 의 값을 출력하지 않고 있습니다.
$this->db->order_by("no", "desc");
$this->db->like($item, $decode_value);
이 두 부분이 문제일 겁니다.
a 테이블과 b 테이블에는 공통되는 no 라는 필드가 존재 합니다.
그럼 db의 옵티마이저는 이렇게 묻습니다.
대체 a 테이블로 정렬 해야해? 아니면 b 테이블로 정렬 해야해?
조인을 넣는 순간 모든 쿼리문에는 해당 테이블을 명시 해줘야 합니다.
[예외적으로 두 테이블 간 필드 네임 중복이 하나도 없는 경우는 예외. 보통 이런 경우는 잘 없음. 작정하고 설계하지 않는이상.]
아 무슨말인지 이해 했습니다 ㅎㅎ정말 감사합니다 정말 쉽게 잘 설명 해주시네요
감사합니다 ㅎㅎㅎ
감기 조심하시길~.~
아참 추가로 계속 눈에 밟혀서 그렇습니다만...
쿼리 문은 가급적 순서를 지켜주세요.
select
from
join
where
group by
having
order by
limit
순서대로 입니다.
액티브레코드를 사용하면 순서를지키지 않아도 생성된 sql문은 kaido님이 댓글에 달아준 순서대로 자동 정렬되기는합니다.
하지만 코딩 할 때 kaido 님 말대로 순서를 지켜주는게 이후 유지보수시 혼란을 줄이는데 도움이 됩니다.
예 명심하겠습니다 ㅎㅎ
조인문이 성사 되려면 이런 형태여야 합니다
a.no
1
2
b.id , b.no
7 1
8 1
9 2
a 테이블의 no는 pk 이고 b 테이블의 id 도 pk 이지만 b.no 는 a 테이블의 pk 인 no 값이 들어가야 합니다.
일단 조인문은 둘째치고...
a 와 b 의 일치 하는 필드 부터 찾으셔야 합니다.
a 와 b 의 no 값이 전혀 다른데 어떻게 일치를 시키지요?
테이블 저장 자체가 잘못된 케이스 입니다.