2

I need to find out how many times each value is duplicated. Here's what I've got so far. I'd like to use it for counting votes in polls.

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

And it returns me which values are duplicated, like this:

1st answer
2nd answer
4th answer

But I still need the number, to show how many times it's duplicated. Something like this.

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

EDIT: Solution that worked for me

In controller:

$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'))));

In view:

foreach ($votes as $vote):
echo $vote[0]['TotalVotes'];
endforeach;
1
  • You specified only a single field in select query, create a dummy column that will count the answer. and easily you can count them. Commented Aug 28, 2012 at 10:35

4 Answers 4

5

This query will work.

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

CakePHP equivalent find condition:

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

You will find TotalVotes in a separate array at index [0]. To overcome this issue, just write the following code before your select query:

$this->Answer->Vote->virtualFields['TotalVotes'] = 0;
Sign up to request clarification or add additional context in comments.

3 Comments

It works for me with one small change. Thanks! I'll post solution later because 'Users with less than 10 reputation can't answer their own question for 8 hours after asking' policy :)
What was that change, you can mention it here.
1

This also works:

   $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')
                                )));

Comments

-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';
}

Comments

-1

Here you can search Groups of records from multiple duplicate records

  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';
    }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.