【问题标题】:Zend 2 subquery columnsZend 2 子查询列
【发布时间】:2015-04-16 20:46:24
【问题描述】:

我想在 Zend Framework 2 中创建一个 SQL(MySQL) 查询,例如:

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()})")

甚至像这里建议的 lambda 函数:http://circlical.com/blog/2014/1/27/zend-framework-2-subqueries-subselect-and-table-gateway

仍然没有运气,因为我一直收到以下错误:

没有为准备好的语句中的参数提供数据

当我成功完成查询时,最终该列包含子查询的文本。它开始看起来不可能在列方法中创建多个表达式。有什么想法吗?

已解决: 我按照@Tim Klever 的提议逐个查询重写了查询。除了一个查询外,一切正常。事实证明,在子查询和主查询中使用限制时存在某种问题。在我的情况下,其中一个子查询返回多行,因此我使用了 limit(1) 来强制返回单个值。但是使用它结果会产生错误:

没有为准备好的语句中的参数提供数据

我将查询更改为使用 MAX 而不是 limit,现在它可以工作了。稍后将尝试调试为什么会发生这种情况..谢谢!

【问题讨论】:

    标签: mysql sql zend-framework2 subquery expression


    【解决方案1】:

    以下内容为我生成了您列出的查询

    $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);
    

    【讨论】:

      猜你喜欢
      • 2013-03-06
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多