【问题标题】:help with SQL query in YiiYii 中的 SQL 查询帮助
【发布时间】:2011-10-26 14:54:49
【问题描述】:

给定下图:

使用下面的代码,我为每个组织分组了捐赠,现在我正在尝试计算给定成员向给定组织捐赠的总金额。

类似:

使用此代码,它可以根据我的需要正确地对组织进行分组,但我遇到的问题是,对于“捐赠给组织的金额”列,所有值都等于 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'), 

编辑:另见对 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 所需的方向。还有其他想法吗?

【问题讨论】:

    标签: mysql sql yii


    【解决方案1】:

    如果我理解您的尝试,您似乎需要添加一个“有”属性,例如

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

    【讨论】:

    • 这让我更接近了。我认为我在 memberOrgBalance 关系中需要这个,而不是数据提供者标准,对吗?但是在 dp 中它可以替换“on”。由于 SUM 在关系中,我尝试在其中添加它,但如果使用您的子句,它不喜欢语法,如果我将其更改为 t.MemberId=member.MemberId 我会收到一条错误消息,提示找不到列。我会将其发布为对问题的编辑。感谢您的帮助。
    • 您可以尝试将上面的这些属性添加到您的捐赠“标准”而不是“与”属性中吗?看看你能不能先得到你想要的数据,然后你可以优化关系。
    • 如果我将 'on' 更改为 'condition' 并将所有 3 个移动到标准,我会得到相同的错误。如果我只移动“组”和“拥有”,我会得到与原始问题相同的结果。对于这种类型的查询,随着表的增长,最好尝试直接的 SQL 方法并将 AR 抛在后面。你认为这会是一个更明智的选择,而不是试图让这个工作?
    • 如果它仍然不起作用,当然只需使用直接 sql(通过“createCommand”)或至少只对模型(捐赠)进行操作,因为这是您的数据所在并使用关系只是为了从其他表中获取名称。虽然这不是一个非常复杂的查询,但有时避免 AR 会更容易,而且它也会为您提供更好的性能。对于复杂的查询,我有时会生成结果并使用 CArrayDataProvider 创建 dataProvider。
    • 顺便说一句,您确实需要“组”子句中的 MemberId。你应该可以使用AR,只是这里的关系似乎有点复杂。也就是说,您似乎已经很接近了——现在我再看一遍,您应该能够删除“有”子句并在 DP 语句中添加 MemberId 作为“条件”——因为生成的除了“有”子句之外,sql 似乎是正确的。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      好吧,在用这个转了一圈之后,有人能够将我推到 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 对此的帮助。

      【讨论】:

      • 是的,对不起,如果不是更清楚-这就是我想说的-该查询与您发布的错误的输出几乎相同,更少“拥有”声明。很高兴你成功了。
      猜你喜欢
      • 2021-03-17
      • 2010-10-20
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多