2012-08-28 82 views
1

我需要找出每個值的重複次數。這是迄今爲止我所擁有的。我想用它來進行民意測驗中的投票。如何統計cakephp中的重複值?

$this->set('votes', $this->Answer->Vote->find('all', array(
        'fields' => array('Vote.answer_id'), 
        'group' => array('Vote.answer_id HAVING COUNT(*) > 1')))); 

,並返回我該值是重複的,就像這樣:

1st answer 
2nd answer 
4th answer 

但我仍然需要的數量,以顯示它是多少次重複。像這樣的東西。

1st answer (5) 
2nd answer (3) 
3rd answer (1) // not duplicated 
4th answer (8) 

編輯: 解決方案,能爲我工作

在控制器:

$this->set('votes', $this->Answer->Vote->find('all', array(
     'fields' => array('Vote.answer_id', 'count(*) as TotalVotes'), 
     'group' => array('Vote.answer_id HAVING COUNT(*) >= 1')))); 

鑑於:

foreach ($votes as $vote): 
echo $vote[0]['TotalVotes']; 
endforeach; 
+0

您在select查詢中只指定了一個字段,創建一個虛擬列tha t會計算答案。很容易你可以數它們。 –

回答

4

這個查詢工作。

SELECT answer_id, COUNT(*) AS TotalVotes FROM votes GROUP BY answer_id HAVING COUNT(*) > 1 

CakePHP的等效查找條件:

$result = $this->Answer->Vote->find('all', array(
       'fields' => array('Vote.answer_id', 'count(*) as TotalVotes'), 
       'group' => array('Vote.answer_id HAVING COUNT(*) > 1'))); 

您將在index [0]找到TotalVotes在一個單獨的陣列。爲了解決這個問題,只是你的選擇查詢之前寫上如下代碼:

$this->Answer->Vote->virtualFields['TotalVotes'] = 0; 
+0

Ref:http://stackoverflow.com/questions/11305111/dynamically-add-virtual-field-in-cakephp –

+0

請問如果它不適合你。 –

+0

它適用於我一個小小的變化。謝謝!我稍後會發布解決方案,因爲'聲譽低於10的用戶在詢問'政策後8小時內無法回答自己的問題:) – danny3b

1

這也適用於:

$this->set('votes', $this->Answer->Vote->find('all', array(
     'fields' => array(
      '*', 
      '(SELECT COUNT(*) FROM votes WHERE answer_id = Vote.answer_id) AS `count`'), 
     'group' => array('Vote.answer_id HAVING COUNT(*) >= 1') 
           ))); 
-1
public function admin_duplicate_account() { 
    $this->User->unBindModel(array('hasOne' => array('Admin'))); 

    if ($this->request->is('post') || $this->request->is('put')) { 
     // pr($this->request->data); exit; 
     if ($this->request->data['User']['email'] == 1) { 
      $arr_having = array(); 
      $arr_having['fields'] = 'User.email'; 
      $arr_having['group'] = 'User.email HAVING COUNT(*) > 1'; 
      $regs = $this->User->find('all', $arr_having, array('conditions' => array('User.role' => array('U', 'P'), 'User.user_status' => array('active', 'lead', 'inactive')))); 
      $names = array(); 
      foreach ($regs as $reg) { 
       if ($reg['User']['email']) { 
        $names[] = $reg['User']['email']; 
       } 
      } 

      $this->set('allusers', $this->User->find('all', array(
         'conditions' => array('User.email' => $names, 'User.role' => array('U', 'P'), 'User.user_status' => array('active', 'lead', 'inactive'))))); 
     } 


     if ($this->request->data['User']['first_name'] == 1) { 
      $arr_having = array(); 
      $arr_having['fields'] = 'PersonalInformation.first_name'; 
      $arr_having['group'] = 'PersonalInformation.first_name HAVING COUNT(*) > 1'; 

      $regs = $this->User->find('all', $arr_having, array('conditions' => array('User.role' => array('U', 'P'), 'User.user_status' => array('active', 'lead', 'inactive')))); 

      //pr($regs); exit; 
      $names = array(); 
      foreach ($regs as $reg) { 

       if ($reg['PersonalInformation']['first_name']) { 
        $names[] = $reg['PersonalInformation']['first_name']; 
       } 
       //$names[] = $reg['PersonalInformation']['first_name']; 
      } 
      //pr($names); 
      $data = $this->User->find('all', array(
       'conditions' => array('PersonalInformation.first_name' => $names, 'User.role' => array('U', 'P'), 'User.user_status' => array('active', 'lead', 'inactive')))); 
      //pr($data); exit; 

      $this->set('allusers', $data); 
     } 



     if ($this->request->data['User']['last_name'] == 1) { 

      $arr_having = array(); 
      $arr_having['fields'] = 'PersonalInformation.last_name'; 
      $arr_having['group'] = 'PersonalInformation.last_name HAVING COUNT(*) > 1'; 

      $regs = $this->User->find('all', $arr_having, array('conditions' => array('User.role' => array('U', 'P'), 'User.user_status' => array('active', 'lead', 'inactive')))); 

      //pr($regs); exit; 
      $names = array(); 
      foreach ($regs as $reg) { 

       if ($reg['PersonalInformation']['last_name']) { 
        $names[] = $reg['PersonalInformation']['last_name']; 
       } 
       //$names[] = $reg['PersonalInformation']['first_name']; 
      } 
      //pr($names); 
      $data = $this->User->find('all', array(
       'conditions' => array('PersonalInformation.last_name' => $names, 'User.role' => array('U', 'P'), 'User.user_status' => array('active', 'lead', 'inactive')))); 
      //pr($data); exit; 

      $this->set('allusers', $data); 
     } 


     if ($this->request->data['User']['primary_phone'] == 1) { 

      $arr_having = array(); 
      $arr_having['fields'] = 'PersonalInformation.primary_phone'; 
      $arr_having['group'] = 'PersonalInformation.primary_phone HAVING COUNT(*) > 1'; 

      $regs = $this->User->find('all', $arr_having, array('conditions' => array('User.role' => array('U', 'P'), 'User.user_status' => array('active', 'lead', 'inactive')))); 

      //pr($regs); exit; 
      $names = array(); 
      foreach ($regs as $reg) { 

       if ($reg['PersonalInformation']['primary_phone']) { 
        $names[] = $reg['PersonalInformation']['primary_phone']; 
       } 
      } 
      //pr($names); 
      $data = $this->User->find('all', array(
       'conditions' => array('PersonalInformation.primary_phone' => $names, 'User.role' => array('U', 'P'), 'User.user_status' => array('active', 'lead', 'inactive')))); 
      //pr($data); exit; 

      $this->set('allusers', $data); 
     } 
     if ($this->request->data['User']['dob'] == 1) { 


      $arr_having = array(); 
      $arr_having['fields'] = 'PersonalInformation.dob'; 
      $arr_having['group'] = 'PersonalInformation.dob HAVING COUNT(*) > 1'; 

      $regs = $this->User->find('all', $arr_having, array('conditions' => array('User.role' => array('U', 'P'), 'User.user_status' => array('active', 'lead', 'inactive')))); 

      //pr($regs); exit; 
      $names = array(); 
      foreach ($regs as $reg) { 

       if ($reg['PersonalInformation']['dob']) { 
        $names[] = $reg['PersonalInformation']['dob']; 
       } 
      } 
      //pr($names); 
      $data = $this->User->find('all', array(
       'conditions' => array('PersonalInformation.dob' => $names, 'User.role' => array('U', 'P'), 'User.user_status' => array('active', 'lead', 'inactive')))); 
      //pr($data); exit; 

      $this->set('allusers', $data); 
     } 
    } else { 

     $this->set('allusers', $this->User->find('all', array(
        'conditions' => array('User.role' => array('U', 'P'), 'User.user_status' => array('active', 'lead', 'inactive'))))); 
    } 

    $this->layout = 'admin'; 
} 
-1

在這裏,您可以從多個重複的記錄

搜索記錄組
public function admin_duplicate_account() { 
     $this->User->unBindModel(array('hasOne' => array('Admin'))); 
     $condition = array(
      'User.role' => array('U', 'P'), 
      'User.user_status' => array('active', 'lead', 'inactive'), 
     ); 
     $arr_group = $arr_having = array(); 

     if ($this->request->is('post') || $this->request->is('put')) { 
      //pr($this->request->data); exit; 

      if ($this->request->data['User']['email'] == 1) { 
       $arr_group[] = 'User.email'; 
       $arr_having[] = 'count(User.email) > 1'; 
      } 

      if ($this->request->data['User']['first_name'] == 1) { 
       $arr_group[] = 'PersonalInformation.first_name'; 
       $arr_having[] = 'count(PersonalInformation.first_name) > 1'; 
      } 
      if ($this->request->data['User']['last_name'] == 1) { 
       $arr_group[] = 'PersonalInformation.last_name'; 
       $arr_having[] = 'count(PersonalInformation.last_name) > 1'; 
      } 



      if ($this->request->data['User']['primary_phone'] == 1) { 
       $arr_group[] = 'PersonalInformation.primary_phone'; 
       $arr_having[] = 'count(PersonalInformation.primary_phone) > 1'; 
      } 

      if ($this->request->data['User']['dob'] == 1) { 
       $arr_group[] = 'PersonalInformation.dob'; 
       $arr_having[] = 'count(PersonalInformation.dob) > 1'; 
      } 
     } 
//  pr($arr_group); 
//  pr($arr_having); exit; 
     if ($arr_group) { 
      $arr_group = implode(' , ', $arr_group); 
      $arr_having = implode(' && ', $arr_having); 
      $group = array("$arr_group HAVING $arr_having"); 
     } else { 
      $group = array(); 
     } 
     $data = $this->User->find('all', array(
//   'fields'=>'count(User.email)', 
      'conditions' => $condition, 
//   'fields' => 'count(User.email,PersonalInformation.first_name, PersonalInformation.last_name,PersonalInformation.primary_phone,PersonalInformation.dob)', 
//   'group' => array('User.email, PersonalInformation.first_name, PersonalInformation.last_name,PersonalInformation.primary_phone,PersonalInformation.dob HAVING count(User.email) > 1 && count(PersonalInformation.first_name) > 1 && count(PersonalInformation.last_name) > 1 && count(PersonalInformation.dob && count(PersonalInformation.primary_phone))') 
      'group' => $group 
     )); 
     //pr($data); exit; 
     $this->set('allusers', $data); 
     $this->layout = 'admin'; 
    }