6

我试图创建以下语句(有效):

SELECT id, COUNT(*) AS item_count FROM message WHERE user_id_to = '1' AND read_date IS NULL GROUP BY message_id

使用 Codeigniters 活动记录。我的代码如下所示:

$this->db->select('id');
$this->db->from('message');
$this->db->where('user_id_to', $this->session->userdata('id'));
$this->db->where(array('read_date' => NULL));
$this->db->group_by('message_id');
echo $this->db->count_all_results();

我已经检查过,所以 $this->session->userdata('id') 输出的 ID 与我的“常规”SQL 语句相同,并且它是正确的。

奇怪的是我的“常规”语句返回 2,这是正确的。但是我的 Codeigniter statmenet 返回 3,这显然是错误的。

我究竟做错了什么?

4

5 回答 5

9

试试这个:

$this->db->where('read_date IS NULL', null, false);

第三个参数告诉他不要逃避子句......

于 2013-11-05T14:17:27.960 回答
1

count_all_results()将替换您的整个 SELECT 子句,生成的查询将是:

SELECT COUNT(*) AS numrows
FROM message
WHERE user_id_to = <your value> AND read_date IS NULL
GROUP BY message_id

...我当然会跳过任何括号和转义字符,但它们在这里无关紧要。

只需将整个内容放在您的select()电话中:

$this->db->select('id, COUNT(*) as item_count');
于 2013-11-05T14:33:23.713 回答
0

它是与 count_all_results() 结合使用的分组;找到这个线程的解决方案:http ://ellislab.com/forums/viewthread/131724/

于 2013-11-05T14:39:43.797 回答
0

这是where命令中多重比较的方式。检查列数据是否不为空

'sc_id' => 真

这是我如何在 where 子句(Codeignitor)中过滤列的完整示例。最后一个显示Not NULL Compression

$where = array('somebit' => '1', 'status' => 'Published', 'sc_id' => TRUE );
$this->db->where($where);
于 2014-05-07T10:25:44.353 回答
0

好吧,我认为另一种方式可能是:

$this->db->where('read_date IS NOT', 'NULL');

尚未对此进行测试,但理论上应该可以工作,请有人确认。

于 2016-02-05T15:57:48.420 回答