2013-04-02 31 views
0

我需要从mysql中找到那些具有唯一test字段的行。我尝试添加virtualFields得到的test然后我通过test场分组计数,并检查该测试必须等于1虚拟字段和在CakePHP中使用HAVING

以下是我的代码......它给了错误:Syntax error or access violation

public function index() 
{ 
    $this -> User -> virtualFields(array(
     'countTest' => "COUNT(User.test)" 
    )); 

    $users = $this -> User -> find('all', array(
     'conditions' => array('countTest' => 1), 
     'group' => 'User.test' 
    )); 

    pr($users); die; 
} 

我找到了解决问题的MySql查询:'SELECT test, COUNT(*) as count FROM users GROUP BY test HAVING COUNT(*) = 1';

您可以在CakePHP格式中转换上述查询。

+1

注意“virtualFields”不是* *的方法,它的型号的* *财产;要添加一个虚拟字段,使用:$ this-> user-> virtualFields = array('countTest'=>'COUNT(User.test)');'。阅读这里的文档:[虚拟领域](http://book.cakephp.org/2.0/en/models/virtual-fields.html)。但是,将它用作HAVING条件在CakePHP中有点棘手,它必须附加到'GROUP BY'子句中。请参阅@icebreaker提供的答案中的“组”键。 – thaJeztah

回答

2

像这样的东西可能会导致你正确的解决方案

$this->User->find('all', array(
    'fields' => array('User.test', 'COUNT(User.test) AS User__test_count'), 
    'group' => array('User.test'), 
    // or even cake style SQL injection :) 
    // 'group' => array('User.test HAVING COUNT(*) = 1') 
)); 
+0

非常感谢你! – user2185041

+0

不客气。 – icebreaker