syncake 2015-03-21 16:57:42 3424次浏览 1条回复 0 0 0

大家好, 今天做一个树状结构的统计报表搞不定,特来咨询

有3个表,user,user_agent,log: user存用户记录,user_agent存所有上下级关系(类似phpcms 中的parentarr,不过是拆分成多条记录而已),log存用户财务日志,表定义如下

user(
   id
   agent_id  //直接父级
   username ....
)

user_agent(
   parent_id 
   user_id 
   distance //上下级距离,
)

fund_log(
   user_id,  // whom is this log belongs 
   type,
   amount,
)

例如A添加代理商是B,B添加代理商C,那么user_agent表中,会有以下代理商关系记录,分别是 parent_id user_id distance A.id B.id 1 B.id C.id 1 A.id C.id 2

那么问题来了,如何在User模型中定义统计A所有代理商的总财物金额呢?

尝试使用STAT定义如下

class User extends CActiveRecord{

        public function relations(){

                return array(
                                'fund_report' => array(self::STAT, 'FundLog', '{{user_agent}}(agent_id, user_id)',
                        'select' => 'SUM(fund_report.amount)',
                        'condition' => '`type` = 1',
                        ),
                        );

        }
}

产生的SQL是

SELECT SUM(fund_report.amount) AS `s`, //fund_report是故意写错,产生的SQL会打印出来
      `lt_user_agent`.`agent_id` AS `c0`
FROM `lt_fund_log` `t`
INNER JOIN `lt_user_agent` ON (`t`.`id`=`lt_user_agent`.`user_id`)  // 这里应该是t.user_id 才是正确的业务需求
WHERE (TYPE = 1)
GROUP BY `lt_user_agent`.`agent_id` HAVING (`lt_user_agent`.`agent_id`=36)

如何才能设置INNER JOIN 这里主表使用 user_id来连表呢?

  • 回复于 2015-03-21 16:58 举报

    试了好久,这个是最接近解决的写法了,跪求舰长指教!

您需要登录后才可以回复。登录 | 立即注册