我有一个DQL,如下所示:
SELECT at, count(at.id) FROM AccountTriple at JOIN at.property p JOIN at.account ac WHERE p.create_analytics = '1' GROUP BY at.property, at.value, ac.service
如您所见,它有三个连接。作为' at'和' ac'两者都有大量的数据。为了优化它,我试图移动" p.create_analytics =' 1'""在加入' ac'之前检查给它一个较小的数据集来加入。我正在努力实现这样的目标:
SELECT at, count(at.id) FROM ( SELECT at FROM AccountTriple at JOIN at.property p WHERE p.create_analytics = '1' ) JOIN at.account ac GROUP BY at.property, at.value, ac.service
但不知何故,我的语法不起作用。错误消息显示如下:
语义错误]第0行,第29列靠近'(选择FROM':错误:类'('未定义。
在其他地方也没有找到类似的例子。有没有人可以帮助修复此DQL查询以使其正常工作?提前谢谢。
答案 0 :(得分:5)
使用createSubquery()
函数在Doctrine中创建子查询。然后,您可以将子查询嵌套到主查询中。
// build root query
$query = Doctrine_Query::create()
->from('Movie m')
->where('name = ?', 'Prometheus')
;
// build subquery
$subquery = $query->createSubquery()
->from('SeenMovie sm')
->where('m.name = sm.name')
;
// nest subquery and execute
$query->where('EXISTS (' . $subquery->getDql() . ')')->execute();
进一步阅读
A Bulletproof Pattern for Creating Doctrine Subqueries of Any Complexity