2010-01-06 18 views
12

i have interrogazione funzionale in MySql:Dottrina sottoquery in InnerJoin

select t.won,e.etot, s.username,s.country,r.points,r.rank FROM sf_guard_user s 
INNER JOIN marks r ON r.user_id = s.id 
inner join (select t.user_id,count(t.user_id)as won from topper t group by t.user_id) t on t.user_id=s.id 
inner join (select e.user_id,count(e.user_id)as etot from exams e group by e.user_id) e on e.user_id=s.id 
ORDER BY r.rank asc 

ho scritto il codice dottrina nella sfGuardUserTable Classe:

$q= $this->createQuery('u'); 

     $wq =$q->createSubquery() 
     ->select('t.user_id,count(t.user_id) won') 
     ->from('Topper t') 
     ->groupBy('t.user_id'); 

     $dq = $q->createSubquery() 
     ->select('e.user_id,count(e.user_id) etot') 
     ->from('Exams d') 
     ->groupBy('d.user_id'); 

     $q->select(' t1.won, e1.dtot, u.username,u.country,r.points,r.rank') 
     ->innerJoin ('u.Marks r ON r.user_id = u.id') 
     ->innerJoin ('u.('.$wq->getDql().') t1 on t1.user_id=u.id') 
     ->innerJoin ('u.'.$dq->getDql().' e1 on e1.user_id=u.id') 
     ->orderBy('r.rank asc'); 

     //echo $q->getSql(); 
     return $q; 

sta dando l'errore Impossibile trovare la classe SELEZIONA :(si prega di aiuto Grazie in anticipo

+1

Perché è necessario astrarre la query in questo modo? Basta digitare come persone normali. –

+0

U R DOIN 'IT WRONG. Non hai bisogno di Doctrine per tali query ('$ q-> seleziona ('t1.won, e1.dtot, u.username, u.country, r.points, r.rank')'). – develop7

+0

@ tor Valamo: potresti guidarmi a scrivere come al solito. Voglio dire, questo è l'unico modo che conosco perché non voglio eseguire più di una query per lo stesso compito. –

risposta

10

ho provato a eseguire la mia query personalizzata direttamente dall'opzione di query Doctrine Row Sql e il suo lavoro :) mi è piaciuto condividerlo qui:

$q = new Doctrine_RawSql(); 
     $q->select('{t.won}, {e.etot}, {s.username},{s.country},{r.marks},{r.ranks}'); 
     $q->from('sf_Guard_User s INNER JOIN marks r ON r.user_id = s.id inner join (select t.id,t.user_id,count(t.user_id)as won from topper t group by t.user_id) t on t.user_id=s.id inner join (select d.id,d.user_id,count(e.user_id)as etot from exams e group by e.user_id) e on e.user_id=s.id ORDER BY r.rank asc'); 
     $q->addComponent('s', 'sfGuardUser s'); 
     $q->addComponent('r', 's.Marks r'); 
     $q->addComponent('t', 's.Topper t'); 
     $q->addComponent('e', 's.Exams e'); 
     return $q; 

per ulteriore assistenza read it.

+0

Non sono sicuro se questa sia la soluzione migliore ma funziona anche per me :). – martin