我尝试了不同的连接类型,但无法确定应该使用哪种类型。我想计算每篇文章的评论数量。
$select = $this->_db->select()
->from($this->_name)
->joinLeft('categories', 'categories.cat_id = ' . $this->_name . '.category', array('category_name' => 'name'))
->joinLeft('comments', 'comments.post_id = ' . $this->_name. '.post_id', array('num_comments' => 'COUNT(*)'))
->group($this->_name.'.post_id')
->limit(3)
->order("pubDate DESC");
if($category_id > 0) $select->where("category = ?", $category_id);
if($last_pub_date > 0) $select->where("$this->_name.pubDate < ?", $last_pub_date);
我也将这种方法用于我的Twitter,就像分页一样,所以$last_pub_date
就是为了这个。使用joinLeft()
似乎很好但当然如果没有对文章查询的评论,则将计数提取为1而不是0.我尝试使用其他连接类型,但如果没有注释,则不提取整行或{{1无法正常工作。我也试过子查询,但我不确定我是否应该写它。
答案 0 :(得分:2)
左连接是正确的,但您需要使用COUNT(comment_id)
而不是COUNT(*)
。 COUNT(*)
将返回行数,即使没有注释也会为1。 COUNT(comment_id)
将返回非NULL
comment_id
值的数量,这些值应该是您正在寻找的值。
http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_count