Zend 2 子查询列
Zend 2 subquery columns
我想在 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 查询,我在其中使用:
$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
仍然不走运,因为我一直收到如下错误:
No data supplied for parameters in prepared statement
当我成功使查询工作时,最终该列包含子查询的文本。它开始看起来不可能在 columns 方法中创建多个表达式。有什么想法吗?
已解决:
我按照@Tim Klever 的建议逐个查询地重写了查询。除一个查询外,一切正常。事实证明,在子查询和主查询中使用限制时存在某种问题。在我的例子中,子查询之一 return 的多行,所以我使用 limit(1) 来强制 return 的单个值。但是使用它却产生了错误:
No data supplied for parameters in prepared statement
我将查询更改为使用 MAX 而不是 limit,现在可以使用了。稍后会尝试调试为什么会这样。谢谢!
以下内容对我有用,可以生成您列出的查询
$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);
我想在 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 查询,我在其中使用:
$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
仍然不走运,因为我一直收到如下错误:
No data supplied for parameters in prepared statement
当我成功使查询工作时,最终该列包含子查询的文本。它开始看起来不可能在 columns 方法中创建多个表达式。有什么想法吗?
已解决: 我按照@Tim Klever 的建议逐个查询地重写了查询。除一个查询外,一切正常。事实证明,在子查询和主查询中使用限制时存在某种问题。在我的例子中,子查询之一 return 的多行,所以我使用 limit(1) 来强制 return 的单个值。但是使用它却产生了错误:
No data supplied for parameters in prepared statement
我将查询更改为使用 MAX 而不是 limit,现在可以使用了。稍后会尝试调试为什么会这样。谢谢!
以下内容对我有用,可以生成您列出的查询
$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);