2012-08-28 3 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

선택 쿼리에 하나의 필드 만 지정 했으므로 더미 열을 생성하십시오. t는 대답을 계산할 것이다. 쉽게 그들을 셀 수 있습니다. –

답변

4

이 쿼리가 작동합니다.

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

CakePHP의 상당 찾기 조건 : 당신은 index [0]에서 별도의 배열에 TotalVotes를 찾을 수

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

. 이 문제를 극복하기 위해, 당신의 선택 쿼리하기 전에 다음 코드를 작성 :

$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'; 
    } 
관련 문제