I have a DQL as like below:
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
As you can see, it has three joins. As 'at' and 'ac' both have large amount of data. In attempt to optimize it, I am trying to move the "p.create_analytics = '1'" checking before join to 'ac' to give it a smaller data set to join. I am trying to achieve something like this:
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
But somehow, my syntax isn't working. A error message is showing as below:
Semantical Error] line 0, col 29 near '( SELECT at FROM': Error: Class '(' is not defined.
Didn't find similar example anywhere else as well. Does anyone can help to fix this DQL query to get working? Thanks in advance.
Use the createSubquery()
function to create a subquery in Doctrine. You can then nest the subquery into your main query.
// 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();
Further Reading
A Bulletproof Pattern for Creating Doctrine Subqueries of Any Complexity
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With