2011-07-18 2 views
7

私はこのことを実現するために長い時間探しています。zend dbモデルで 'distinct'を使用する方法

私が欲しいのは、ユーザーが一意のフォロワーのために自分の選択をするために、私はどのようにユーザーを '別個の' zendデータベースモデルで知っていることです。

ユーザーのためのフォロワーをカウントするマイデシベルモデル(ここで私は「明確な」を追加する必要があります)

public function countFollowers($user_id) 
{  
    $rowset  = $this->fetchAll("user_id = $user_id"); 
    $rowCount  = count($rowset); 

    if ($rowCount > 0) { 
     return $rowCount; 
    } else { 
     return $rowCount; 
    } 
} 

EDIT:この関数は、の一部である

私のテーブルのクラスApplication_Model_DbTable_Followersが取得Zend_Db_Table_Abstract拡張 "を'USER_ID' で書かれている記事の構造

  • ID
  • のarticle_id //同上。
  • のuser_id //従う

'のuser_id' は、この記事

  • 日//日付はフォロワーができ、様々な記事を書くことができ、以下のいる記事
  • follower_id //メンバーのuser_idは所有者同じ作家のさまざまな記事に従ってください。私は一意のフォロワー数を作りたいと思う。たとえば、私が望むものとして、フォロワーが1人の作家の8つの記事をフォローしている場合は、カウントで「1」と比較する必要があります。

    これは、私が到達しようとしたことを理解するのに十分明確であることを望みます。種類に関しては

    ニッキー

  • 答えて

    11

    他に、1を返します。実際にはグループを使用する必要があります。私は、コードをテストしていませんが、このような何かが動作するはず、次のクエリは、カウント()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; 
    } 
    
    2

    あなたは選択クエリ機能を構成する関数「から」内の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をマッチング。

    public function countFollowers($user_id) 
    { 
        $select = $this->select() 
           ->distinct() 
           ->where('user_id = ?', $user_id); 
    
        $rowset = $this->fetchAll($select); 
        $rowCount = count($rowset); 
    
        return $rowCount; 
    } 
    

    EDIT::質問で編集した後ユーザーのフォロワーの数を取得するために、ユーザが発見されたのであれば、それは明確な使用0

    +0

    素晴らしい!これはうまくいきました。唯一の編集はgroupを 'follower_id'に設定してuser_idのみを取得し、thatsは常に '1'にな​​ります。どうもありがとう! – Nicky

    2

    単純にカウントを取得することは、過剰なものとして私を襲う。

    あなたはこのようなものを使用して、カウントを行うことができます。

    ​​
    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); 
    } 
    
    エルス

    エラーが発生していますミスクリのように見えるエラー:

    Unknown column 'repertoire.distinct idRepertoireParent' in 'field list'

    0

    今日私はJOIN LEFTのケースでDISTINCTを試しましたが、動作しません。しかし、DISTINCT列にGroup Byを追加すると、正常に動作します。

    0

    また、我々は公式マニュアル

    からの一つの方法だけでこのクエリを作成する

    "明確な" を使用しています。P

    $select = $db->select() 
          ->distinct() 
          ->from(array('p' => 'products'), 'product_name'); 
    
    AS "製品" とは区別pはSELECT "PRODUCT_NAMEを"。
    関連する問題