Codeigniter活动记录 - 在IFNULL和COUNT里面

时间:2013-05-09 17:39:53

标签: codeigniter activerecord count ifnull

我有一个基本上模拟储物柜的应用程序。在每个储物柜内,我有N个架子。在每个机架内,我有N个盒子,N个文件夹和N本书。其中一些对象是不可访问的(它们有一个名为ACESSIBLE的布尔属性)。

我想显示每个储物柜和按类型(书籍,文件夹和方框)排序的对象总和。类似的东西:

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');

1 个答案:

答案 0 :(得分:0)

我猜是这样的:

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