2015-04-16 141 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); 
查询