2013-05-09 68 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或不。我想在每個只返回可訪問objetcs的計數上輸入一個WHERE條件(類似WHERE boxes.ACESSIBLE = 1)。我怎樣才能做到這一點?

謝謝。

編輯:好的,所以我找到了解決方法:更改爲此:

$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 2013-05-09 19:44:36

+0

第二個想法,因爲你正在分組記錄,而不是在哪裏你可能需要一個HAVING子句。另外,你還有其他限制,比如book.ACESSIBLE和folder.ACESSIBLE嗎? – 2013-05-09 19:48:43

+0

是的。我有box.ACESSIBLE,book.ACESSIBLE和folder.ACESSIBLE。一些值爲0的記錄,其他值爲1.我只想顯示其值爲1的記錄。我試着用HAVING,但沒有成功。 – aseolin 2013-05-09 20:03:26

相關問題