CI 묻고 답하기

제목 DB join and union 질문
카테고리 CI 2, 3
글쓴이 ezcom 작성시각 2018/07/23 18:40:38
댓글 : 4 추천 : 0 스크랩 : 0 조회수 : 14600   RSS

MYSQL을 사용 하고 있습니다. 

하나의 스키마에 테이블이 총 5개이며 join과 union이 동시에 이루어져야 합니다.

구 테이블과 신규 테이블이 모양이 틀려 기존 테이블을 VIEW로 신규 테이블과 맞추어 놓은 상태이고요

일단 셈플 쿼리 자체는 잘 실행 되는이 이것을 CI에서 사용 하려고 하는데 CI에 익숙치 않아서 질문 드립니다.

테이블 모양

===============================================================

Table A

 - Index int(11) primary key

 - ID varchar(20) not null

 - etc varchar(10) default null

 

TABLE B_OLD

 - CODE int(11)

 - value int(10)

 - ID varchar(20)

 

TABLE B

 - CODE int(11)

 - value int(10)

 - ID varchar(20)

 

TABLE C_OLD

 - CODE int(11)

 - value int(10)

 - ID varchar(20)

 

TABLE C

 - CODE int(11)

 - value int(10)

 - ID varchar(20)

===============================================================

셈플 쿼리

 SELECT A.*, BB.Value, CC.Value FROM A

      left outer join (SELECT B.ID AS ID, B.Value  AS Value FROM B UNION ALL SELECT B_OLD.ID AS ID, B_OLD.Value AS Value FROM B_OLD) AS BB ON BB.ID=A.ID

     left outer join (SELECT C.ID AS ID, C.Value AS Value FROM C UNION ALL SELECT C_OLD.ID AS ID, C_OLD.Value AS VALUE FROM C_OLD) AS CC ON CC.ID=A.ID 

  WHERE A.ID='my_ID''';

 

==> 예상 CI model code

$this->db->where('A.ID', $id);

$this->db->select('A.*, BB.Value, CC.Value', false)

$this->db->join('(SELECT B.ID AS ID, B.Value AS Value FROM B UNION ALL SELECT B_OLD.ID AS ID, B_OLD.Value AS Value) AS BB','BB.ID=A.ID','left outer');

$this->db->join('(SELECT C.ID AS ID, C.Value AS Value FROM C UNION ALL SELECT C_OLD.ID AS ID, C_OLD.Value AS Value) AS CC','CC.ID=A.ID','left outer');

$this->db->order_by('A.index', 'asc');

$qry = $this->db->get('A', $limit, $offset);

$result['qry'] = $qry->result_array();

 

==> 질문 드리고자 하는 요지

2개의 테이블을 union all 한 테이블들을 join 하고자 합니다. 적절한 CI코드 인지 확인 부탁드립니다.

 A left outer join (B union all B_OLD) left outer join (C union All C_OLD)

 

 

 다음글 상세에 목록이 존재하는 경우, 컨트롤러 / 모델 구성 (3)
 이전글 컨트롤러 파일의 생성 기준 (6)

댓글

한대승(불의회상) / 2018/07/23 19:10:25 / 추천 0
쿼리가 복잡한 경우엔 쿼리빌더 보다 $this->db->query() 에 직접 SQL문을 실어 던지는것이 좋습니다.
kaido / 2018/07/24 09:04:12 / 추천 0

굳이 사용하신다면 $this->db->join  부분이 잘못 되었습니다.

메뉴얼에서 한번 확인해 보세요

ezcom / 2018/07/24 11:04:35 / 추천 0

Union 절을  view로 다시 생성해서 간략하게 만들어 보았습니다. 테스트 환경구성이 어려운 상황이라.  

CREATE VIEW BB AS

SELECT * FROM B_OLD UNION ALL SELECT * FROM B

 

CREATE VIEW CC AS

SELECT * FROM C_OLD UNION ALL SELECT * FROM C

 

$this->db->where('A.ID', $id);

$this->db->select('A.*, BB.Value, CC.Value', false)

$this->db->join('BB','BB.ID=A.ID','left outer');

$this->db->join('CC','CC.ID=A.ID','left outer');

$this->db->order_by('A.index', 'asc');

$qry = $this->db->get('A', $limit, $offset);

$result['qry'] = $qry->result_array();

메뉴얼에  $this->db->join 의 첫 파라메터가 table 이름이라고만 나와서 일단 뷰로 단순화 시켰습니다.

변종원(웅파) / 2018/07/24 18:12:15 / 추천 0

join에 서브쿼리 사용이 안됩니다. 

복잡한 쿼리는 그냥 사용하시는걸 추천합니다. 한대승님 의견에 한 표 +