如何在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
。id
,keyword
,volume
,cpc
,competition
,keyword_id
FROM {{1} } LEFT JOINkeyword
ON keyword.id = ad_group_keyword.keyword_id WHERE((ad_group_keyword
IS NULL)AND(NOT(keyword_id
IS NULL)))AND(NOTvolume
IS NULL))ORDER BYcpc
desc LIMIT 1
我也试过
volume
但它会生成
FROM
leftJoin('ad_group_keyword', ['keyword.id'=>'keyword_id', 'ad_group_id'=>1])->
LEFT JOINkeyword
ON(ad_group_keyword
。keyword
=' keyword_id')AND(id
= 1)< / p>
使用&#39; keyword_id&#39;在引号中,所以它将它视为一个字符串!
文档:http://www.yiiframework.com/doc-2.0/yii-db-query.html#leftJoin()-detail
(这就是我讨厌处理ORM API的原因。我花了很多时间精通SQL。现在你让我学习了一种全新的方法来做同样的事情,有时它是不可能的。)< / p>
答案 0 :(得分:2)
关于您必须处理ORM API的说法,您可以使用ActiveRecord[]
方法。您可以使用此方法使用原始SQL查询。不同之处在于,您不会获得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();
(这对于复杂的查询通常很好)。
iloc
答案 1 :(得分:0)
leftJoin('ad_group_keyword', ['and', 'keyword.id = keyword_id', "ad_group_id = $adGroupId"])->
...啧