제목 | 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_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 값이 전혀 다른데 어떻게 일치를 시키지요?
테이블 저장 자체가 잘못된 케이스 입니다.