2013-05-09 1 views
0

기본적으로 보관함을 시뮬레이트하는 응용 프로그램이 있습니다. 각 락커 안에는 N 개의 랙이 있습니다. 각 랙에는 N 개의 상자, N 개의 폴더 및 N 개의 책이 있습니다. 이 객체 중 일부는 액세스 할 수 없습니다 (ACESSIBLE이라는 부울 속성이 있음).Codeigniter Active Record - IFNULL 및 COUNT 내부에있는 단어

각 락카와 유형 (책, 폴더 및 상자)별로 주문하는 개체의 합계를 표시하고 싶습니다. 뭔가 같은 :

RACK_ID : 1
RACK_NUMBER : 001
LOCKER_NUMBER : 54
SUM_BOXES : 10
SUM_FOLDERS : 20
SUM_BOOKS : 10

내 쿼리 :

$this->db->select('r.ID AS RACK_ID, r.NUMBER AS RACK_NUMBER, l.NUMBER AS LOCKER_NUMBER) 
    ->select('IFNULL(COUNT(DISTINCT `box`.`ID`), 0) AS `SUM_BOXES`', FALSE) 
    ->select('IFNULL(COUNT(DISTINCT `book`.`ID`), 0) AS `SUM_BOOKS`', FALSE) 
    ->select('IFNULL(COUNT(DISTINCT `folder`.`ID`), 0) AS `SUM_FOLDERS`', FALSE); 

$this->db->from('rack r'); 

$this->db->join('locker l', 'l.ID = r.LOCKER_fk', 'inner'); 
$this->db->join('box box', 'box.RACK_fk = r.ID', 'left'); 
$this->db->join('book book', 'book.RACK_fk = r.ID', 'left'); 
$this->db->join('folder folder', 'folder.RACK_fk = r.ID', 'left'); 

$this->db->where('r.LOCKER_fk', $this->session->userdata('LOCKER_ID')); 

$this->db->group_by("r.ID"); 

이 작동하지만 카운트는 각 랙에서 모든 상자, 책 및 폴더를 반환합니다. ACESSIBLE 또는 NOT. 난 단지 하나의 objetcs (something something WHERE boxes.ACESSIBLE = 1)를 반환하는 각 count에 WHERE 조건을 입력하고 싶습니다. 어떻게해야합니까?

감사합니다.

편집 : 좋아, 그래서 나는 해결책을 발견 :이로 변경이 같은

$this->db->join('box box', 'box.RACK_fk = r.ID AND box.ACESSIBLE= "1"', 'left'); 
$this->db->join('book book', 'book.RACK_fk = r.ID AND book.ACESSIBLE= "1"', 'left'); 
$this->db->join('folder folder', 'folder.RACK_fk = r.ID AND folder.ACESSIBLE= "1"', 'left'); 

답변

0

내가 추측하고 뭔가 : 대답에 대한

$this->db->where('r.LOCKER_fk', $this->session->userdata('LOCKER_ID')); 
$this->db->where('box.ACESSIBLE', '1'); 
+0

감사합니다. 이미 시도했지만 작동하지 않습니다. 예상 결과와 다른 결과를 반환합니다. – aseolin

+0

두 번째 아이디어는 레코드를 그룹화하기 때문에, HAVING 절이 필요한 위치 대신에 레코드를 그룹화하기 때문입니다. 또한 book.ACESSIBLE 및 folder.ACESSIBLE과 같은 다른 제약 조건이 있습니까? –

+0

예. 나는 박스를 가지고있다. 가능하다. book.ACESSIBLE과 folder.ACESSIBLE. 값이 0 인 레코드 일부는 값이 1 인 레코드입니다. 값이 1 인 레코드 만 표시하고 싶습니다. HAVING을 시도했지만 성공하지 못했습니다. – aseolin

관련 문제