2015-04-16 71 views
0

我想在Zend框架2創建一個SQL(MySQL的)查詢,如:Zend的2子查詢列

SELECT a.id, 
     a.name, 
     a.age, 
     (SELECT MAX(score) 
     FROM scores AS s 
     WHERE s.user_id = a.id) AS max_score, 
     (SELECT SUM(time) 
     FROM games_played_time AS gpt 
     WHERE gpt.user_id = a.id) AS time_played 
FROM users AS a 
ORDER BY last_visited DESC 
LIMIT 0, 100 

記住,這是現有查詢的一個人爲的例子。

我試圖創建子查詢,然後創建哪裏,當我使用的主要選擇查詢:

$select->columns(
      array(
        'id', 
        'name', 
        'age', 
        'max_score' => new Expression('?', array($sub1), 
        'time_played' => new Expression('?', array($sub2) 
       ) 

我使用也試過:

$subquery = new \Zend\Db\Sql\Expression("({$sub->getSqlString()})") 

即使拉姆達功能,如這裏建議:http://circlical.com/blog/2014/1/27/zend-framework-2-subqueries-subselect-and-table-gateway

仍然沒有運氣,因爲所有的時間我總是得到像這樣的錯誤:

No data supplied for parameters in prepared statement

而且,當我成功完成查詢工作時,結束了該列包含子查詢的文本。它開始看起來不可能在列方法中創建多個表達式。有任何想法嗎?

求解: 我重寫了@Tim Klever提出的查詢查詢。除了一個查詢之外,Everythin工作。事實證明,在子查詢和主查詢中使用限制時存在某種問題。在我的情況下,其中一個子查詢返回多行,所以我使用limit(1)強制返回單個值。但使用,結果產生錯誤:

No data supplied for parameters in prepared statement

我改變了查詢使用MAX而不是限制,現在它的工作原理。稍後會嘗試調試爲什麼會發生這種情況..謝謝!

回答

3

以下爲我工作產生你上市

$maxScoreSelect = new Select(); 
$maxScoreSelect->from(array('s' => 'scores')); 
$maxScoreSelect->columns(array(new Expression('MAX(score)'))); 
$maxScoreSelect->where->addPredicates('s.user_id = a.id'); 

$sumTimeSelect = new Select(); 
$sumTimeSelect->from(array('gpt' => 'games_played_time')); 
$sumTimeSelect->columns(array(new Expression('SUM(time)'))); 
$sumTimeSelect->where->addPredicates('gpt.user_id = a.id'); 

$select = new Select(); 
$select->from(array('a' => 'users')); 
$select->columns(array(
    'id', 
    'name', 
    'age', 
    'max_score' => new Expression('?', array($maxScoreSelect)), 
    'time_played' => new Expression('?', array($sumTimeSelect)) 
)); 
$select->order('last_visited DESC'); 
$select->limit(100); 
$select->offset(0); 
查詢