2011-08-14 32 views
3

SQL查詢鑑於如下圖:幫助,Yii中

enter image description here

有了下面的代碼,我已經爲每個組織分組的捐贈我現在想計算總金額定成員已經捐贈給一個特定的組織。

喜歡的東西:

enter image description here

有了這個代碼是正確的羣體,因爲我需要一個組織,但這個問題我這裏是列在「捐贈給組織金額」的所有值等於總的最高身份的組織。因此,在該列中的所有行顯示$ 90

的Yii代碼:

// member view 
<?php 
    $dataProvider=new CActiveDataProvider(Donation::model(), array(
     'criteria'=>array(
      'with' => array(
       'member' => array(
        'on'=>'member.MemberId='.$model->MemberId, 
        'group' => 't.MemberId, t.OrganizationId', 
        'joinType'=>'INNER JOIN', 
        ), 
       ), 
     'together'=> true, 
     ), 
    )); 
    $this->widget('zii.widgets.grid.CGridView', array(
     'dataProvider'=>$dataProvider,  
     'columns' => array(
      array(
       'name'=>'OrganizationId', 
       'value' => '$data->OrganizationId', 
      ), 
      array(
       'name'=>'Amount', 
       'value' => '$data->memberOrgBalance;', 
      ), 
     ), 
    )); 
?> 


// member model 

'memberOrgBalance' => array(self::STAT, 'Donation', 'MemberId', 
     'select'=>'MemberId, OrganizationId, SUM(Amount)', 
     'group' => 'OrganizationId'), 

// donation model 

'member' => array(self::BELONGS_TO, 'Member', 'MemberId'), 

編輯:參見響應LDG

從LDG使用建議我嘗試添加 '具有' 到我的數據提供者,當這似乎沒有影響查詢時,我試圖將其添加到關係memberOrgBalance,我試圖拉數據。這似乎會影響查詢,但它仍然不正確。我切換到:

'memberOrgBalance' => array(self::STAT, 'Donation', 'MemberId', 
     'select'=>'MemberId, OrganizationId, SUM(Amount)', 
     'group' => 'OrganizationId', 
     'having'=> 'MemberId=member.MemberId', 
     ), 

這給這個錯誤:

CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: 
Column not found: 1054 Unknown column 'member.MemberId' in 'having clause'. 
The SQL statement executed was: SELECT `MemberId ` AS `c`, MemberId, OrganizationId, 
SUM(Amount) AS `s` FROM `donation` `t` WHERE (`t`.`MemberId `='2') 
GROUP BY `MemberId `, OrganizationId HAVING (MemberId=member.MemberId) 

這是沒有意義的,因爲從捐贈表我已經定義的關係如上最初發布。儘管如此,查詢似乎成爲每個組織獲得SUM所需的方向。任何其他想法?

回答

0

好了,在圈子裏跑來跑去,這個人能夠把我推到Yii論壇上的解決方案。

最終的結果是

$criteria->condition='member.MemberId="'.$model->MemberId.'"'; 
$criteria->with='member'; 
$criteria->select='MemberId,OrganizationId,sum(Amount) as Amount'; 
$criteria->group='t.MemberId,OrganizationId'; 
$dataProvider=new CActiveDataProvider(Donations::model(), 
    array(
     'criteria'=>$criteria, 

感謝LDG與此幫助。

+0

是的,對不起,如果它不是更清楚 - 這就是我想說的 - 這個查詢幾乎與你發佈錯誤的輸出相同,而不是「有」聲明。真高興你做到了。 – ldg

2

如果我明白你正在嘗試它似乎像你需要添加一個「具有」屬性,有點像

'on'=>'member.MemberId = t.MemberId', 
'group' => 't.MemberId, t.OrganizationId', 
'having'=> 't.MemberId=' . $model->MemberId 
+0

這使我更接近。我認爲我需要這個在我的memberOrgBalance關係中,而不是數據提供者標準正確嗎?在dp中它可以代替'on'。由於SUM是我試過了增加,但如果使用條款它不喜歡的語法,如果我將其更改爲t.MemberId = member.MemberId的關係,我得到一個錯誤說沒有發現列。我將發佈這個作爲編輯的問題。我很感激幫助。 – enfield

+0

您可以嘗試將以上屬性添加到捐贈「標準」而不是「擁有」屬性嗎?看看你是否可以先獲得你想要的數據,然後你可以優化關係。 – ldg

+0

如果我將'開'更改爲'條件'並將所有3都移至標準,我會得到相同的錯誤。如果我只移動'組'和'擁有',我會得到與原始問題相同的結果。使用這種類型的查詢和隨着表的增長,嘗試一種直接的SQL方法並將AR留在後面可能會更好。你認爲這將是一個明智的選擇,而不是試圖讓這個工作? – enfield

0

這是必要的SQL查詢..

select donation_org_id , sum(donation_amount) as donated_amount, count(d.donation_id) as members_count 
from donations d 
group by d.donation_org_id