Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Yii中SQL查询的帮助_Mysql_Sql_Yii - Fatal编程技术网

Mysql Yii中SQL查询的帮助

Mysql Yii中SQL查询的帮助,mysql,sql,yii,Mysql,Sql,Yii,如下图所示: 根据下面的代码,我将每个组织的捐款分组,现在我正试图计算某个成员向某个组织捐款的总额 比如: 使用此代码,它可以根据我的需要正确地对组织进行分组,但我在这里遇到的问题是,对于“捐赠给组织的金额”列,所有值都等于Id最高的组织的总数。因此,该列中的所有行都显示90美元 Yii代码: // member view <?php $dataProvider=new CActiveDataProvider(Donation::model(), array(

如下图所示:

根据下面的代码,我将每个组织的捐款分组,现在我正试图计算某个成员向某个组织捐款的总额

比如:

使用此代码,它可以根据我的需要正确地对组织进行分组,但我在这里遇到的问题是,对于“捐赠给组织的金额”列,所有值都等于Id最高的组织的总数。因此,该列中的所有行都显示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'), 
这就产生了这个错误:

   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)

这没有任何意义,因为从捐赠表中,我定义了上面最初发布的关系。不过,查询似乎正朝着我想要的每个组织的总和的方向发展。还有其他想法吗?

如果我理解您的想法,您可能需要添加一个“having”属性,比如

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

这是所需的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

好吧,在和这个人绕圈子后,有人能把我推到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在这方面的帮助。

这让我离得更近了。我想在我的memberOrgBalance关系中需要这个,而不是数据提供者标准,对吗?但在dp中,它可以替换“on”。由于SUM在关系中,我尝试将其添加到那里,但是如果使用您的子句,它不喜欢语法,如果我将其更改为t.MemberId=member.MemberId,则会出现一个错误,即column not found。我会将此作为问题的编辑发布。我非常感谢您的帮助。您是否可以尝试将上述属性添加到您的捐赠“标准”中,而不是“带”属性?看看是否可以先获得所需的数据,然后再优化关系。如果我将“开”更改为“条件”,并将所有3个更改为“条件”,则会得到相同的错误。如果我只移动“组”和“拥有”,我得到的结果与我原来的问题相同。对于这种类型的查询,随着表的增长,最好尝试直接的SQL方法,而不使用AR。你认为这是一个更明智的选择,而不是试图让它工作吗?如果它仍然不工作,当然可以直接使用sql(通过“createCommand”)或者至少只在模型上操作(捐赠),因为这是你的数据所在,并使用关系从其他表中获取名称。虽然这不是一个非常复杂的查询,但有时避免AR更容易,而且它也会给您带来更好的性能。对于复杂的查询,我有时会生成结果并使用CArrayDataProvider创建数据提供程序。顺便说一句,您确实需要“group”子句中的MemberId。你应该能够使用AR,这里的关系似乎有点复杂。这就是说,看起来你很接近了——现在我再看一遍,你应该可以删除“having”子句,然后在DP语句中添加MemberId作为“condition”——因为生成的sql似乎是正确的,而不是“having”子句。是的,抱歉,如果没有更清楚的话——这就是我想说的——该查询与您发布的带有错误的查询的输出几乎相同,更少的是“having”语句。很高兴你让它工作了。
$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,