2012-08-28 29 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'; 
    }