如何在zend db模型中使用'distinct'

时间:2011-07-18 12:49:05

标签: mysql sql zend-framework

我已经找了很长时间才能让这件事工作。

我想知道的是如何在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'

的一部分

我的表结构

  • ID
  • article_id //由'user_id'撰写的文章的ID。
  • user_id //文章的user_id所有者
  • follower_id //关注此文章的成员
  • 日期//关注日期

'user_id'可以写出各种文章,关注者可以关注同一作者的各种文章。我想做一个独特的追随者计数。作为一个例子,我想要的是,如果一个追随者正在追踪一位作家的8篇文章,那么它必须与计数中的“1”进行比较。

我希望这很清楚,以了解我想要达到的目标。

亲切的问候,

尼基

6 个答案:

答案 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');