2009-12-08 12 views
11

Tengo una consulta en MySQL:Doctrina - subconsulta desde

SELECT * FROM (
    SELECT COUNT(*) AS count, t.name AS name 
    FROM tag t 
    INNER JOIN video_has_tag v USING (idTag) 
    GROUP BY v.idTag 
    ORDER BY count DESC 
    LIMIT 10 
) as tags ORDER BY name 

y quiero escribir esto en la doctrina. ¿Como puedo hacer eso? Escribí:

Doctrine_Query::create() 
     ->select('COUNT(t.idtag) as count, t.name') 
     ->from('Tag t') 
     ->innerJoin('t.VideoHasTag v') 
     ->groupBy('v.idTag') 
     ->orderBy('count DESC, t.name') 
     ->limit(30) 
     ->execute(); 

Pero no puedo ponerlo en "de" para ordenar por nombre.

+0

¿Qué quiere decir con: "ponerlo en" de "ordenar por nombre"? –

+0

¿la doctrina apoya la subconsulta? tal vez poner toda la consulta desde (...) – Yada

+0

@Chris Williams: mira la consulta de MySQL :) @Yada: Cuando pongo toda la consulta desde() Doctrina dime que "no existe la tabla (SELECCIONAR) – snapshot

Respuesta

9

Esta es una respuesta:

$q = new Doctrine_RawSql(); 
$q->addComponent('t', 'Tag') 
    ->select('{t.name}, {t.count}') 
    ->from('(SELECT COUNT(*) as count, t.name,t.idtag 
     FROM Tag t 
      INNER JOIN Video_Has_Tag v USING(idTag) 
     GROUP BY v.idTag 
     ORDER BY count DESC 
     LIMIT 50) t') 
    ->orderBy('name'); 
1

Doctrine no puede hacer una subconsulta en la cláusula FROM (ni puede unirse a una subconsulta). Tu consulta actual de Doctrine va a ordenar por conteo y luego por nombre. ¿No es eso lo que quieres?

+0

Ahora es ordenar por conteo y cuando es el mismo valor es ordenar por nombre. Quiero obtener nube de etiquetas estándar: 10 etiquetas con mayor conteo ordenadas por nombre – snapshot

0

Doctrine le permitirá poner una subconsulta en la cláusula FROM. Sin embargo, solo puede tomar sentencias de texto DQL en la subconsulta, no puede usar otro objeto de consulta. Si reescribe su subconsulta de DQL en forma textual, debería poder usarla.

Consulte this page of the documentation para ver un ejemplo. El ejemplo coloca la subconsulta DQL en la cláusula WHERE, pero menciona que puede usar subconsultas en la cláusula FROM.

+0

Escribí: $ etiquetas = Doctrine_Query :: create() -> de ('(SELECT COUNT (*) como count, t.name FROM Tag t INNER JOIN t.VideoHasTag v GROUP BY v.idTag ORDER BY count DESC LIMIT 30) como etiquetas') -> orderBy ('nombre') - > execute(); y obtengo "No se pudo encontrar la clase (SELECT" – snapshot

+2

Doctrine * NO * admite subconsultas en la cláusula FROM, a pesar de lo que dicen los documentos: http://groups.google. com/group/doctrine-user/browse_thread/thread/7572bf091e822b1f/d72952f5aa1378ee – EvanK

2

utilizo Doctrina 1.2 y Symfony 1.4 yDoctrine_RawSql obras con subconsultas. A continuación, puede addComponent para los modelos.

Algo vale la pena mencionar es que no se puede utilizar directamente Doctrine_Query objetos como subconsultas PERO usted puede conseguir fácilmente la forma de SQL a través del método getSqlQuery() o incluso getSqlQueryPart y utilizar el resultado de la subconsulta .

getSqlQueryPart es útil para reconstruir solo ciertas partes de una consulta.

+0

No hay tal cosa como Doctrine_RawSql() –