使用Having(count())和CI活动记录

时间:2014-01-10 13:07:08

标签: php sql codeigniter

我有以下SQL查询,但我似乎无法找到如何更改此查询以使其与CI一起使用:

SELECT *
FROM Table1
JOIN Table2 ON Table2.tID = Table1.tID
JOIN Table3 ON Table3.vID = Table2.vID
WHERE vegetable
IN (
'Potatoe', 'Carrot'
)
GROUP BY Table1.tID
HAVING COUNT( DISTINCT vegetable ) =2

以下是我目前对CI的看法:

$arrCount = count($array);
$this->db->select('*');
this->db->from('Table1');
$this->db->join('Table2', 'Table2.tID = Table1.tID'); 
$this->db->join('Table3', 'Table3.vID = Table2.vID');
$this->db->where_in('vegetable', $array);
$this->db->group_by("Table1.tID");
$this->db->having('vegetable');
$this->db->count_all($arrCount);
$q = $this->db->get();

但这样做会给我以下sql语句:

Table 'DatabaseTest.2' doesn't exist

SELECT COUNT(*) AS `numrows` FROM `2`

我很确定我使用的ActiveRecord计数是不正确的,但我不确定它会是什么,因为我找到了CI的任何COUNT()函数。

所以我的问题是如何在CodeIgniter中进行SQL查询?

额外注意,我还尝试使用CI $this->db->query运行查询,但在查看in时会出现数组错误。

$this->db->query('SELECT *
FROM Table1
JOIN Table2 ON Table2.tID = Table1.tID
JOIN Table3 ON Table3.vID = Table2.vID
WHERE vegetables
IN (
' .$array . '
)
GROUP BY Table1.tID
HAVING COUNT( DISTINCT vegetables ) =' . $arrCount);

接下来是错误信息:

Unknown column 'Array' in 'where clause'

所以假设我使用的是where而不是where in。有人可以帮助我让我的SQL与CI活动记录一起使用吗?

3 个答案:

答案 0 :(得分:1)

$this->db->query('SELECT *
FROM Table1
JOIN Table2 ON Table2.tID = Table1.tID
JOIN Table3 ON Table3.vID = Table2.vID
WHERE vegetables
IN ("' . implode('", "', $array) . '")'
GROUP BY Table1.tID
HAVING COUNT( DISTINCT vegetables ) =' . $arrCount);

使用implode()将数组转换为MySQL可读字符串。

编辑:以引号内爆。

答案 1 :(得分:1)

我没有使用活动记录测试第一个查询,但是这不起作用吗? count_all是一个自己的查询。第一个参数假设是表...你输入数组的大小就像2表!!! active records reference

$arrCount = sizeof($array);
$this->db->select('*');
this->db->from('Table1');
$this->db->join('Table2', 'Table2.tID = Table1.tID'); 
$this->db->join('Table3', 'Table3.vID = Table2.vID');
$this->db->where_in('vegetable', $array);
$this->db->group_by("Table1.tID");
$this->db->having('COUNT(DISTINCT vegetable)', $arrCount);
$q = $this->db->get();

此外,对于查询,您需要将数组转换为字符串:

$this->db->query('SELECT *
FROM Table1
JOIN Table2 ON Table2.tID = Table1.tID
JOIN Table3 ON Table3.vID = Table2.vID
WHERE vegetables
IN (
' .implode(',',$array) . '
)
GROUP BY Table1.tID
HAVING COUNT( DISTINCT vegetables ) =' . $arrCount);

答案 2 :(得分:0)

我可能会建议 $ this-> db-> count_all($ arrCount); 一行,直到你开始工作为止。