duanao4503 2015-06-19 01:54
浏览 205
已采纳

如何在Yii2中创建复杂的左外连接?

How do I perform this query in Yii2?

SELECT `keyword`.`id`, `keyword`, `volume`, `cpc`, `competition`, `keyword_id` 
FROM `keyword` 
LEFT JOIN `ad_group_keyword` 
  ON keyword.id = ad_group_keyword.keyword_id 
  and ad_group_id = 1 
WHERE ((`keyword_id` IS NULL) 
  AND (NOT (`volume` IS NULL))) 
  AND (NOT (`cpc` IS NULL)) 
ORDER BY volume desc 
LIMIT 1;

I tried the following and many combinations but I can't get the ON part right.

$kw = Keyword::find()->select(['keyword.id', 'keyword', 'volume', 'cpc', 'competition', 'keyword_id'])->
  leftJoin('ad_group_keyword', 'keyword.id = ad_group_keyword.keyword_id', ['ad_group_id'=>1])->
  andWhere(['keyword_id'=>null])->
  andWhere(['not', ['volume' => null]])->andWhere(['not', ['cpc' => null]])->
  orderBy('volume desc')->asArray()->limit(1)->all();

The above generates this SQL, which is missing the second condition of the ON:

SELECT keyword.id, keyword, volume, cpc, competition, keyword_id FROM keyword LEFT JOIN ad_group_keyword ON keyword.id = ad_group_keyword.keyword_id WHERE ((keyword_id IS NULL) AND (NOT (volume IS NULL))) AND (NOT (cpc IS NULL)) ORDER BY volume desc LIMIT 1

I also tried

leftJoin('ad_group_keyword', ['keyword.id'=>'keyword_id', 'ad_group_id'=>1])->

But it generates

FROM keyword LEFT JOIN ad_group_keyword ON (keyword.id='keyword_id') AND (ad_group_id=1)

With 'keyword_id' in quotation marks, so it treats it as a string!

Docs: http://www.yiiframework.com/doc-2.0/yii-db-query.html#leftJoin()-detail

(This is why I hate dealing with ORM APIs. I spent all that time becoming proficient at SQL. Now you make me learn a whole new way of doing the same thing, and sometimes it's impossible.)

  • 写回答

2条回答 默认 最新

  • douxiaomang5640 2015-06-19 14:48
    关注

    In relation to your remark of having to deal with ORM API, you can use the createCommand approach. You can just use your raw sql query with this method. The difference is that you don't get ActiveRecord[] as a result but just array[] (which is usually fine for complex queries).

    $sql = "SELECT `keyword`.`id`, `keyword`, `volume`, `cpc`, `competition`, `keyword_id` 
    FROM `keyword` 
    LEFT JOIN `ad_group_keyword` 
      ON keyword.id = ad_group_keyword.keyword_id 
      and ad_group_id = 1 
    WHERE ((`keyword_id` IS NULL) 
      AND (NOT (`volume` IS NULL))) 
      AND (NOT (`cpc` IS NULL)) 
    ORDER BY volume desc 
    LIMIT 1;";
    
    $params = [];
    
    $kw = Yii::$app->db->createCommand($sql, $params)->queryAll();
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败