2013-12-10 75 views
0

我有問題獲取標準參數和表別名工作。我需要這樣的語句:Yii加入子查詢,如何添加參數?

SELECT x.* FROM stl_election x 
JOIN (SELECT agent_id, economy_id, MAX(outcome) max_outcome FROM stl_election WHERE economy_id = 92 AND agent_id = 6203 GROUP BY stl_election.economy_id) y 
ON y.max_outcome-3 <= x.outcome 
AND y.economy_id = x.economy_id 
AND y.agent_id = x.agent_id 

我已經作出了這一點:

$election = StlElection::model(); 
    $criteria = new CDbCriteria; 
     $criteria->select = "agent_id, economy_id, MAX(outcome) max_outcome"; 
     $criteria->condition = 'agent_id=:agent_id AND economy_id=:economy_id'; 
     $criteria->params = array(
      ':agent_id' => $agent->id, 
      ':economy_id' => $this->economy->id 
     ); 
     $criteria->group = 'stl_election.economy_id'; 


     $bestChoiceSql = $election->getCommandBuilder()->createFindCommand($election->getTableSchema(), $criteria)->getText(); 

     $criteria2 = new CDbCriteria; 

     $criteria2->join = '(' . $bestChoiceSql . ') y ON y.max_outcome-3 <= x.outcome 
    AND y.economy_id = x.economy_id 
AND y.agent_id = x.agent_id'; 
$criteria2->alias = 'x'; 

     $considerChoices = StlElection::model()->findAll($criteria2); 

輸出是:

Invalid parameter number: no parameters were bound. The SQL statement executed was: SELECT `t`.`agent_id`, `t`.`party_id`, `t`.`economy_id`, `t`.`outcome` FROM `stl_election` `t` (SELECT agent_id, economy_id, MAX(outcome) max_outcome FROM `stl_election` `t` WHERE agent_id=:agent_id AND economy_id=:economy_id GROUP BY stl_election.economy_id) y ON y.max_outcome-3 <= x.outcome 
AND y.economy_id = x.economy_id 
AND y.agent_id = x.agent_id 
+0

好吧,我不知道爲什麼,但分配params到$ criteria2是這樣的爲此。別名仍然存在問題... – RobM

+0

你能檢查「$ this-> economy-> id」返回什麼嗎?空或什麼的? –

+0

我已經記錄它economy-> id = 92和agent-> id = 6203. $ criteria-> params數組也檢查 – RobM

回答

0

在我看來,你是從一個非常SQL看着這個的觀點,而不是一個Yii的觀點。我建議你學習模型關係和CDbCriteria的功能。注意,對於CDbCriteria,如果你打算使用 - > with()函數,那麼一定要包含 - > together = true;

Yii CDbCriteria Class Reference

爲您簡單的答案可能是隻執行一個SQL查詢,試試這個:

$query = "SELECT x.* FROM stl_election x 
JOIN (SELECT agent_id, economy_id, MAX(outcome) max_outcome FROM stl_election WHERE economy_id = 92 AND agent_id = 6203 GROUP BY stl_election.economy_id) y 
ON y.max_outcome-3 <= x.outcome 
AND y.economy_id = x.economy_id 
AND y.agent_id = x.agent_id"; 

$result = Yii::app()->db->createCommand($sql)->queryAll(); 
+0

不行,我更喜歡AciveRecord類 – RobM

0

如果有人有興趣回答:

$election = StlElection::model(); 
    $criteria = new CDbCriteria; 
     $criteria->select = "agent_id, economy_id, MAX(outcome) max_outcome"; 
     $criteria->condition = 'agent_id=:agent_id AND economy_id=:economy_id'; 
     $criteria->params = array(
      ':agent_id' => $agent->id, 
      ':economy_id' => $this->economy->id 
     ); 
     $criteria->group = 'stl_election.economy_id'; 


     $bestChoiceSql = $election->getCommandBuilder()->createFindCommand($election->getTableSchema(), $criteria)->getText(); 

     $criteria2 = new CDbCriteria; 

     $criteria2->join = 'JOIN (' . $bestChoiceSql . ') y ON y.max_outcome-3 <= x.outcome 
    AND y.economy_id = x.economy_id 
AND y.agent_id = x.agent_id'; 
$criteria2->alias = 'x'; 

     $considerChoices = StlElection::model()->findAll($criteria2); 

我只是錯過'加入'in - >加入:/