2015-10-18 181 views
4

我能夠找到構建子查詢的簡單示例,但是當我需要包含WHERE條件時無法找出解決方案並找到解決方案。我試圖模仿下面的語句...在Yii2中使用WHERE條件選擇子查詢find()/ QueryBuilder

SELECT ParentTable.*, (SELECT MAX(ChildTable.NumberField) 
         FROM ChildTable 
         WHERE ChildTable.FK_Id = ParentTable.Id) 
FROM ParentTable 

想我會需要像...

$query = ParentClass::find() 
     ->addSelect(
      ChildClass::find() 
      ->where('childTable.fk_id=parentTable.id') 
      ->max('childTable.field1') 
     ); 

但它給我一個錯誤:未找到列:1054未知列' parentTable.id」在 'where子句'

編輯: 包括實際的類/表名...

$endQuery = UnitSchedule::find() 
      ->where('cm_courseschedule.id=cm_unitschedule.csch_id') 
      ->max('cm_unitschedule.slot'); 
$query = CourseSchedule::find(); 
$query->addSelect($endQuery); 
+0

什麼是你的表的名稱和相應的類? – topher

+0

我知道我的班級名稱和表名是正確的。不過,相應地編輯了我的問題。 –

+0

您是否還可以在錯誤中包含sql語句? – topher

回答

2

感謝Used_By_Already和Mike Ross,您的回覆幫助我完成了下面最終完整的Yii2/MySQL解決方案。

$query = ParentClass::find(); 
$subQuery = ChildClass::find()->select('fk_id, max(column1) as column1')->groupBy('fk_id'); 
$query->leftJoin(['T' => $subQuery], 'T.fk_id = parentTable.id'); 
0

試試這個,因爲它工作得很好,我也有類似的情況在我的表名是eventarea_interest

$query = new Query(); 
$subquery = new Query(); 
$subquery ->select(['area_intrest.interest']) 
      ->from('area_intrest') 
      ->where('area_intrest.id = event.interest_id'); 

$query ->select(['event.title',$query3]) 
      ->from('event'); 
$command = $query->createCommand(); 
$data = $command->queryAll(); 

在你的病情,你甚至可以在引號中的子查詢使用max,它會正常工作。

2

從SQL角度看的示例查詢在select子句中使用「相關子查詢」,通常這是形成查詢的非常低效的方式。

SELECT ParentTable.*, (SELECT MAX(ChildTable.NumberField) 
         FROM ChildTable 
         WHERE ChildTable.FK_Id = ParentTable.Id) 
FROM ParentTable 

雖然它可能乍一看似乎是更復雜的,因而效率較低,這是通常用於性能,以避免在一個選擇條款「相關的子查詢」,並且使用「派生表」,而不是替代爲佳,像這樣的:

SELECT ParentTable.*,c.MxNum 
FROM ParentTable 
LEFT JOIN (
      SELECT ChildTable.FK_Id, MAX(ChildTable.NumberField) as MxNum FROM ChildTable 
      GROUP BY ChildTable.FK_Id 
      ) AS c ON c.FK_Id = ParentTable.Id 

注意,相關子查詢與選擇的條款可能返回NULL,並且由於這一點,如果與派生表替代它們的等同的聯接類型是LEFT OUTER JOIN(或簡稱LEFT JOIN)作爲這也允許NULL結果。但是,如果您不需要列的NULL,那麼請使用更有效的INNER JOIN。

爲了不知道Yii2語法而提前道歉,但似乎知道有助於解決問題的有效替代方法。

0

試試這個

$submodel = ChildClass::find() 
      ->select([ 'ChildTable.fk_id', 'MAX(ChildTable.NumberField)', ]) 
      ->where("...") 
      ->asArray(); 

$model = ParentClass::find() 
      ->select([ 'parentTable.*', 'b.*', ]) 
      ->innerJoin(['b' => $submodel], 'b.`fk_id` = parentTable.`id`') 
      ->all();