CI 묻고 답하기

제목 CI SQL 간단 JOIN 문 질문드립니다.
글쓴이 루비콘 작성시각 2016/01/20 13:19:52
댓글 : 9 추천 : 0 스크랩 : 0 조회수 : 15977   RSS

간단한 JOIN 문 입니다 좀 막히는 부분이 있어서 질문드립니다.

 

우선 dgc_edu_trade_1_0dgc_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] => 확인
                )

        )
 다음글 csrf get으로 보낼때 (2)
 이전글 Tapbbs 설치시 에러 입니다 (4)

댓글

kaido / 2016/01/20 13:43:26 / 추천 0

 

조인문이 성사 되려면 이런 형태여야 합니다

 

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 값이 전혀 다른데 어떻게 일치를 시키지요?

테이블 저장 자체가 잘못된 케이스 입니다.

 

 

 

 

 

루비콘 / 2016/01/20 13:48:50 / 추천 0

우선 빠른 답변 감사드립니다.

허면 테이블 구조를 저렇게 만해서 사용한다면 join 은 사용 할 수 없는 건지요?

제가 하려는게 아우터 조인인데 그렇다면 no 값만 서로 동일 하다면 정상작동 하는게 맞는건가요?

kaido / 2016/01/20 13:51:10 / 추천 0

그렇습니다.

 

전혀 상관없는 값으로는 조인은 불가능 할 뿐더러, 가져온다 해도 예상과 전혀 다른 값을 가져옵니다.

 

일단 공통되는 필드가 있어야 조인이 되는지, 유니온이 되는지, 서브쿼리가 되는지 구분이 됩니다.

 

그런데 전혀 공통된게 없으면 db 할애비가 와도 안됩니다.

 

루비콘 / 2016/01/20 13:54:37 / 추천 0

재미난 답변이네요 ㅎㅎㅎㅎ

말씀하신데로 두번째 테이블의 no 값을 동일하게 수정하였습니다.

헌데도 에러가 발생하는데 이유가 뭔지 잘 모르겠습니다 

여전히 첫번째 테이블의 모든값 (*) 만 출력하고 

두번때 테이블의 product_name 의 값을 출력하지 않고 있습니다.

kaido / 2016/01/20 13:58:31 / 추천 0

$this->db->order_by("no", "desc");

$this->db->like($item, $decode_value);

 

이 두 부분이 문제일 겁니다.

 

a 테이블과 b 테이블에는 공통되는 no 라는 필드가 존재 합니다.

 

그럼 db의 옵티마이저는 이렇게 묻습니다.

 

대체 a 테이블로 정렬 해야해? 아니면 b 테이블로 정렬 해야해?

조인을 넣는 순간 모든 쿼리문에는 해당 테이블을 명시 해줘야 합니다.

[예외적으로 두 테이블 간 필드 네임 중복이 하나도 없는 경우는 예외. 보통 이런 경우는 잘 없음. 작정하고 설계하지 않는이상.]

루비콘 / 2016/01/20 14:02:23 / 추천 0

아 무슨말인지 이해 했습니다 ㅎㅎ정말 감사합니다 정말 쉽게 잘 설명 해주시네요

감사합니다 ㅎㅎㅎ

감기 조심하시길~.~

kaido / 2016/01/20 14:05:44 / 추천 0

아참 추가로 계속 눈에 밟혀서 그렇습니다만...

 

쿼리 문은 가급적 순서를 지켜주세요.

 

select

from

join

where

group by 

having 

order by

limit

 

순서대로 입니다.

한대승(불의회상) / 2016/01/20 14:11:35 / 추천 0

액티브레코드를 사용하면 순서를지키지 않아도 생성된 sql문은 kaido님이 댓글에 달아준 순서대로 자동 정렬되기는합니다.

하지만 코딩 할 때 kaido 님 말대로 순서를 지켜주는게 이후 유지보수시 혼란을 줄이는데 도움이 됩니다.

루비콘 / 2016/01/20 14:12:12 / 추천 0

예 명심하겠습니다 ㅎㅎ