2016-12-02 60 views
1

我要執行這個查詢子查詢中andFilterWhere在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(); 

什麼shoul d我做得到結果提到sql查詢,我不想打兩次數據庫服務器,提前致謝

+1

怎麼樣使用DAO,像這樣$ =後的Yii :: $ APP- > db-> createCommand('SELECT * FROM post WHERE id = 1') - > queryOne(); (見yii的指南) – dimis283

回答

1

使用加入:

$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(); 
1

因爲很難遵循你的邏輯。爲了簡化您的代碼和查詢,請將第一個條件添加爲純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();