2014-09-23 104 views
0

IA有一個問題,在多計數加入Zend的左連接數不工作

$query = $this->select() 
     ->setIntegrityCheck(false) 
     ->from(array('u' => 'users')) 
     ->join(array('c' => 'clients'), 'u.id = c.user_id', 'COUNT(c.user_id) as clientsCount') 
     ->join(array('emails' => 'u_emails'), 'u.id = emails.user_id', 'COUNT(emails.user_id) as emailsCount') 
     ->join(array('sms' => 'u_sms'), 'u.id = sms.user_id', 'COUNT(sms.user_id) as smsCount') 
     ->where('u.id=?', (int) USER_ID)->group('u.id'); 
+0

我覺得你的問題是,所有的計數返回相同的值? – Benz 2014-09-23 14:23:44

+0

是的,我在u_emails中有4行,在u_sms中有2行,在客戶端有2行。所有的計數都會返回16.我不知道問題出在哪裏。它看起來像增加了。 – Peet 2014-09-23 14:32:15

+0

這是因爲您使用了「Group」。在COUNT組只計算返回的行數(16是因爲有16個唯一的用戶ID,我認爲你可以很容易地用一些子查詢來替換這個查詢。 – Benz 2014-09-23 14:37:56

回答

1

我認爲這可以幫你出這個問題:

$this->select() 
    ->from(array('u' => 'users'), array(
      'clientsCount' => new Zend_Db_Expr("(SELECT COUNT(*) FROM clients WHERE clients.user_id = u.id)"), 
      'emailsCount' => new Zend_Db_Expr("(SELECT COUNT(*) FROM emails WHERE emails.user_id = u.id)"), 
      'smsCount' => new Zend_Db_Expr("(SELECT COUNT(*) FROM sms WHERE sms.user_id = u.id)"), 
    ) 
    ->where('u.id=?', (int) USER_ID) 
    ->group('u.id'); 

我無法測試查詢所以隨時問問你是否有任何問題。

編輯我的回答,請再試一次

+0

錯誤:調用未定義的方法查詢()。 如何在oop中重寫爲我的第一個示例? – Peet 2014-09-23 14:59:49

+0

這需要用Zend_Db_Expr完成,我會給你寫個例子:) – Benz 2014-09-23 15:01:14

+0

@Peet更新了答案 – Benz 2014-09-23 15:06:14

0
$query = $this->select() 
        ->setIntegrityCheck(false) 
        ->from(array('u' => 'users'), array(
         'clientsCount' => new Zend_Db_Expr("SELECT COUNT(*) FROM clients WHERE clients.user_id = u.id"), 
         'emailsCount' => new Zend_Db_Expr("SELECT COUNT(*) FROM u_emails WHERE u_emails.user_id = u.id"), 
         'smsCount' => new Zend_Db_Expr("SELECT COUNT(*) FROM u_sms WHERE u_sms.user_id = u.id") 
        )) 
        ->where('u.id=?', (int) USER_ID)->group('u.id'); 

return $this->fetchRow($query); 

這不是工作..

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de 'SELECT COUNT(*) FROM clients WHERE clients.user_id = u.id AS clientsCount , SEL' à la ligne 1' in C:\wamp\www\cnote\library\Zend\Controller\Plugin\Broker.php on line 336

Zend_Db_Statement_Exception: SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de 'SELECT COUNT(*) FROM clients WHERE clients.user_id = u.id AS clientsCount , SEL' à la ligne 1 in C:\wamp\www\cnote\library\Zend\Db\Statement\Pdo.php on line 234