2013-05-09 100 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

相关问题