yii2 和 FilterWhere 中的子查询

subquery in andFilterWhere in yii2

我必须执行这个查询

select count(id) as numberofcompanies, sum(offered_value) as total_offered_value from campaign_comapany
       where ( campaign_id in (select id from campaing where user_id = current_user ) or campaing_company.sp_user_id = current_user)
             and campaign_company.status = '3'

我在 yii2 中写了这样的查询-

$query->select(['count(id) as numberofcompanies','sum(offered_value) as total_offered_value'])
                                 ->from('campaign_company')
                                 ->andFilterWhere(['or',['in','campaign_id',(new yii\db\Query())->select(['id'])->from('campaign')->where(['=','user_id',Yii::$app->user->id])],['=','campaign_company.sp_user_id',Yii::$app->user->id]])
                                 ->andWhere(['=','status','3'])
                                 ->one();

但是 unknow column campaign_company.user_id 给我错误 但是如果我像下面这样使用 where 就可以工作-

$query->select(['count(id) as numberofcompanies','sum(offered_value) as total_offered_value'])
                                 ->from('campaign_company')
                                 ->where(['in','campaign_id',(new yii\db\Query())->select(['id'])->from('campaign')->where(['=','user_id',Yii::$app->user->id])])
                                 ->andWhere(['=','status','3'])
                                 ->one();

我应该怎么做才能得到提到的结果 sql 查询,我不想两次访问数据库服务器,在此先感谢

很难理解你的逻辑。为了简化您的代码和查询,将第一个条件添加为普通 sql。又因为需要第二个条件,可以交换位置如下:

$query
    ->select(['count(id) as numberofcompanies','sum(offered_value) as total_offered_value'])
    ->from('campaign_company')
    ->where(['status' => '3'])
    ->andWhere(['
        campaign_id in (select id from campaign where user_id = :current_user )
        or campaign_company.sp_user_id = :current_user1', 
        [':current_user' => Yii::$app->user->id, ':current_user1' => Yii::$app->user->id]])
    ->one();

使用连接:

$query->select(['count(id) as numberofcompanies','sum(offered_value) as total_offered_value'])
       ->from('campaign_company')
       ->innerJoin('campaign','`campaign`.`id` = `campaign_company`.`campaign_id`') 
       ->where([
           ['=','campaign.user_id',Yii::$app->user->id])],
           ['=','campaign.campaign_company.sp_user_id',Yii::$app->user->id],
           ['=','campaign_company.status','3']
         ]
       ->one();