Php 条令中带限制的子查询
我正在尝试做一个查询,它有一个子查询。现在它给了我一个错误。我在存储库中的功能是:Php 条令中带限制的子查询,php,mysql,symfony,zend-framework,doctrine-orm,Php,Mysql,Symfony,Zend Framework,Doctrine Orm,我正在尝试做一个查询,它有一个子查询。现在它给了我一个错误。我在存储库中的功能是: public function getRecentPlaylists($count = 3) { $q = $this->_em->createQuery(" SELECT p.id, p.featuredImage, p.title, p.slug,
public function getRecentPlaylists($count = 3) {
$q = $this->_em->createQuery("
SELECT p.id,
p.featuredImage,
p.title,
p.slug,
a.firstName,
a.lastName,
a.slug as authorSlug,
(SELECT updated
FROM \Entities\Articles
ORDER BY updated DESC LIMIT 1) as updated
FROM \Entities\Playlist p
JOIN \Entities\Account a
ON p.account_id = a.id
")
->setMaxResults($count);
try{
return $q->getResult();
}catch(Exception $e){
echo $e->message();
}
}
这给了我一个错误:
[Semantical Error] line 0, col 210 near 'LIMIT 1) as updated FROM': Error: Class 'LIMIT' is not defined.
我几乎要放弃信条了,我还没有弄清楚如何使用子查询进行查询,或者如何使用子查询进行联合。这个功能有什么帮助吗?谢谢 您需要的是取出内部查询并分别为其创建DQL,然后在内部使用生成的DQL
$inner_q = $this->_em
->createQuery("SELECT AR.updated FROM \Entities\Articles AR ORDER BY AR.updated DESC")
->setMaxResults(1)
->getDQL();
$q = $this->_em->createQuery("SELECT p.id,
p.featuredImage,
p.title,
p.slug,
a.firstName,
a.lastName,
a.slug as authorSlug,
(".$inner_q.") AS updated
FROM \Entities\Playlist p
JOIN \Entities\Account a
ON p.account_id = a.id
")
->setMaxResults($count);
try{
return $q->getResult();
}
catch(Exception $e){
echo $e->message();
}
在这种情况下,您可以使用条令的聚合表达式MAX来获取最新日期:
SELECT MAX(a.updated) FROM AppBundle:Article a
您不需要使用LIMIT。您可以很容易地将自己的语法添加到条令中,例如将
LIMIT 1
添加到子查询中,如下所示
//AppBundle\DBAL\FirstFunction
我没有任何教义方面的经验,但您是否尝试过将作为
资本化为作为
?谢谢您的回答。这给了我一个错误:“a”附近的第0行第289列:错误:联接路径表达式中使用了标识变量\Entities\Account,但以前没有定义。@raygo you canvar\u dump($q->getSQL())
然后将查询粘贴到MySQL数据库中,查看错误在哪里;使用SQL查询修复它,然后将这些更改应用到DQL@raygo此外,您是否确定内部查询;因为它甚至不是一个加入,所以您总是选择第一条记录是的,我要播放列表的日期,我要属于该播放列表的最后一篇文章的日期这不起作用setMaxResults在子查询中被忽略,但是如果我需要怎么办,例如LIMIT 15
?这将有所帮助,因为条令返回的错误是子查询返回许多结果(而不是一个)。
$dqb->from('MyAppBundle:Foo', 'foo')
->leftJoin('foo.bar', 'bar', 'WITH', 'bar = FIRST(SELECT b FROM MyAppBundle:Bar b WHERE b.foo = foo AND b.published_date >= :now ORDER BY t.startDate)');