2013-04-02 27 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