繁体   English   中英

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

[英]How do I create a complex left outer join in Yii2?

如何在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;

我尝试了以下和许多组合,但无法正确使用ON部分。

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

上面的代码生成了这个SQL,它缺少ON的第二个条件:

SELECT keyword idkeywordvolumecpccompetitionkeyword_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))订单volume上限1)

我也试过

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

但它产生

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

用'keyword_id'引号引起来,因此将其视为字符串!

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

(这就是为什么我讨厌使用ORM API。我将所有的时间都花在精通SQL上。现在,您使我学习了一种全新的方式来做同样的事情,有时这是不可能的。)

关于必须处理ORM API的说法,可以使用createCommand方法。 您可以仅通过此方法使用原始sql查询。 所不同的是,您不会得到ActiveRecord[]的结果,而只是得到array[]的结果(通常适用于复杂的查询)。

$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();
leftJoin('ad_group_keyword', ['and', 'keyword.id = keyword_id', "ad_group_id = $adGroupId"])->

嘘...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM