【问题标题】:Codeigniter Active Record - WHERE inside IFNULL and COUNTCodeigniter Active Record - IFNULL 和 COUNT 内的 WHERE
【发布时间】:2013-05-04 06:48:31
【问题描述】:

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

我想显示每个储物柜以及按类型(书籍、文件夹和盒子)排序的对象总和。比如:

机架 ID:1
机架号: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");

这很好用,但是计数会返回每个架子上的所有盒子、书籍和文件夹,可访问或不可访问。我想在每个计数上输入一个 WHERE 条件,该条件只返回可访问的对象(类似于 WHERE box.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');

【问题讨论】:

    标签: codeigniter activerecord count ifnull


    【解决方案1】:

    我猜是这样的:

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

    【讨论】:

    • 感谢您的回答。我已经尝试过了,但它不起作用。它返回的结果与预期的结果不同。
    • 第二个想法,因为您正在对记录进行分组,而不是 where 您可能需要 HAVING 子句。另外,您是否还有其他约束,例如 book.ACESSIBLE 和 folder.ACESSIBLE?
    • 是的。我有 box.ACESSIBLE、book.ACESSIBLE 和 folder.ACESSIBLE。一些记录值为 0,另一些记录值为 1。我只想显示值为 1 的记录。我尝试使用 HAVING,但没有成功。
    • 我假设您在某个时候对查询进行了手动编码以开发/调试 SQL。您总是可以手动编码查询并使用 CI 的 query() 函数而不使用活动记录。对于复杂的查询,我避免使用活动记录并使用原生 SQL。
    • 我试图在 mysql 中编写这个查询(没有活动记录),但我不能。我的知识还没有达到这个水平。
    猜你喜欢
    • 2011-11-25
    • 2013-02-27
    • 1970-01-01
    • 2013-01-24
    • 2013-09-26
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多