我已经找了很长时间才能让这件事工作。
我想知道的是如何在zend db模型中使用'distinct'来为我的用户追随者做出选择。
我的数据库模型用于计算用户的关注者(这里我需要添加'distinct')
public function countFollowers($user_id)
{
$rowset = $this->fetchAll("user_id = $user_id");
$rowCount = count($rowset);
if ($rowCount > 0) {
return $rowCount;
} else {
return $rowCount;
}
}
编辑:此函数是'class Application_Model_DbTable_Followers extends Zend_Db_Table_Abstract'
的一部分我的表结构
'user_id'可以写出各种文章,关注者可以关注同一作者的各种文章。我想做一个独特的追随者计数。作为一个例子,我想要的是,如果一个追随者正在追踪一位作家的8篇文章,那么它必须与计数中的“1”进行比较。
我希望这很清楚,以了解我想要达到的目标。
亲切的问候,
尼基
答案 0 :(得分:12)
使用distinct:
public function countFollowers($user_id)
{
$select = $this->select()
->distinct()
->where('user_id = ?', $user_id);
$rowset = $this->fetchAll($select);
$rowCount = count($rowset);
return $rowCount;
}
编辑:在编辑后进行编辑以获取用户的关注者数量。您实际上需要使用 group NOT distinct。我测试了以下查询工作,以获取数据为count()ed,
SELECT * FROM
followers
WHERE user_id = 1 GROUP BY user_id, follower_id
我没有测试过代码,但是这样的代码应该可以运行:
public function countFollowers($user_id)
{
$select = $this->select()
->where('user_id = ?', $user_id)
->group(array('user_id', 'follower_id'));
$rowset = $this->fetchAll($select);
$rowCount = count($rowset);
return $rowCount;
}
答案 1 :(得分:2)
您可以在构成选择查询功能的'from'函数中指定mysql函数。要使用from函数,您需要将表名作为第一个参数传递,但是传递$ this(您的表模型类)可以正常工作。
public function countFollowers($user_id)
{
$rowset = $this->fetchAll(
$this->select()
->from($this, array('DISTINCT user_id'))
->where('user_id = ?', $user_id)
);
return count($rowset);
}
[编辑]
根据您的修改,“群组”也可能适合您:
public function countFollowers($user_id)
{
$rowset = $this->fetchAll(
$this->select()
->where('user_id = ?', $user_id)
->group('user_id')
);
return count($rowset);
}
这会将所有匹配的user_id分组到一个记录中。因此,如果找到用户,则返回1,否则返回0。
答案 2 :(得分:2)
检索所有行只是为了得到一个计数让我觉得有点过分。
您可以使用以下内容进行计数:
$select = $db->select();
$select->from('testcount', new Zend_Db_Expr('COUNT(id)'))
->where('user_id = ?', $someUserId);
return $db->fetchOne($select);
答案 3 :(得分:1)
不写那个:
public function countFollowers($user_id)
{
$rowset = $this->fetchAll(
$this->select()
->from($this, array('DISTINCT user_id'))
->where('user_id = ?', $user_id)
);
return count($rowset);
}
但那:
public function countFollowers($user_id)
{
$rowset = $this->fetchAll(
$this->select()
->from($this, array('DISTINCT(user_id)'))
->where('user_id = ?', $user_id)
);
return count($rowset);
}
否则你会有一个错误,看起来像是Mysqli准备错误:
'字段列表'中的未知列'repertoire.distinct idRepertoireParent'
答案 4 :(得分:0)
今天我在JOIN LEFT案例中尝试了DISTINCT,但它不起作用。但是如果你将一个Group By添加到DISTINCT列,它可以正常工作。
答案 5 :(得分:0)
我们还有一个官方手册中的方法
只需使用“distinct”
即可构建此查询:SELECT DISTINCT p。“product_name”FROM“products”AS p
$select = $db->select()
->distinct()
->from(array('p' => 'products'), 'product_name');