0

私のSqlスキルは不足しており、本当に助けていただければ幸いです. フィールドが同じであるすべてのレコードを取得する最も効率的な方法は何ですか?

たとえば、私のテーブル名は「games」で、テーブル「consoles」と関連付けられています

同じ (重複した) 「名前」を持つゲームのすべての記録を取得し、関連付けを保持して、すべてのフィールドにアクセスできるようにするにはどうすればよいですか?

基本的にこれを変更して、重複のみを表示します。

$this->set('games', $this->Game->find('all', array('order' => array('Game.name' => 'asc'))));

Cake を使用してこれを行う簡単な方法はありますか、または query() を使用して SQL で行うにはどうすればよいですか?

事前に大歓迎です!

よろしく、アッシュ

4

3 に答える 3

1

Konerakクエリを使用しようとしましたが、動作しましたが、小さなテーブルでのみ機能しました。2kレコードのテストベースでは、SQLクライアントでクラッシュし、phpでメモリエラーが発生しました(テストにインデックスなしのフィールドを使用しました)。それがあなたのために働くならば:

$options = array();
$options['joins'][0]['table'] = 'games';
$options['joins'][0]['alias'] = 'Game2';
$options['joins'][0]['conditions'] = array(1 => 1);
$options['conditions'] = 'Game.name = Game2.name';
$options['conditions']['NOT'] = 'Game.id = Game2.id';
$options['order'] = 'Game.name ASC';

//$this->Game->contain();
$this->set('games', $this->Game->find('all', $options));

/ *

このソリューションは2つのクエリを使用しますが、私はそれをうまくテストすることができました。

$options = array();
$options['fields'] = 'Game.name';
$options['group'] = 'Game.name HAVING COUNT(*) > 1';

// get all the names > 1
//$this->Game->contain();
$regs = $this->Game->find('all', $options);

// make a nice array with them
$names = array();
foreach ($regs as $reg) {
$names[] = $reg['Game']['name'];
}

// and search for only those games
//$this->Game->contain();
$this->set('games', $this->Game->find('all', array(
                                     'conditions' => array('Game.name' => $names), 
                                     'order' => 'name ASC')));

それがうまくいかないかどうか、そしてあなたが抱えている問題を教えてください。

編集。行にコメントしましたcontain。とにかくそれらを必要としないように、すべての構造が必要なようです。

edit2。フィールド名のあいまいさを排除します。

于 2012-08-30T14:26:16.693 に答える
0
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';
}
于 2015-03-03T07:06:30.100 に答える
0

Cake にこれを表す方法が組み込まれているかどうかはわかりませんが、この MySQL Method でそれを行うことができます。

$this->set('games', $this->Game->query('SELECT name, COUNT(*) as count FROM games GROUP BY name HAVING count > 1');

選択には、任意のフィールドを含めることができます。


更新しました

これは CakePHP の方法であり、結果はもう少し適切にフォーマットされます。

$this->set('games', $this->Game->find('all',array('fields'=>array('name','COUNT(*) as count'), 'group'=>'name', 'having'=>'count > 1')));
于 2012-08-30T14:03:05.147 に答える