| 제목 | CI SQL 간단 JOIN 문 질문드립니다. | ||
|---|---|---|---|
| 글쓴이 | 루비콘 | 작성시각 | 2016/01/20 13:19:52 | 
|  | |||
| 간단한 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_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
                             | 
| 
                                루비콘
                                /
                                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
                             예 명심하겠습니다 ㅎㅎ | 
조인문이 성사 되려면 이런 형태여야 합니다
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 값이 전혀 다른데 어떻게 일치를 시키지요?
테이블 저장 자체가 잘못된 케이스 입니다.