2011-06-13 17 views
6

Tengo un comando MySQL y no puedo encontrar el equivalente en DQL. Estoy intentando buscar la lista de las publicaciones más comentadas. Este es el comando MySQL:Unirse y contar en DQL

SELECT posts.id, COUNT(comments.id) AS num 
FROM posts 
LEFT JOIN comments ON (posts.id = comments.post_id) 
GROUP BY posts.id 

Aquí está el resultado:

id num 
1 8 
2 9 
3 17 
4 7 
5 6 
6 20 
7 7 
8 10 
9 14 
10 7 

En DQL, debería ser:

SELECT post, COUNT(comment.id) AS num 
FROM Entity\Post post 
LEFT JOIN post.comments comment 
GROUP BY post.id 

Pero esto da:

id num 
1 50 
2 0 
3 0 
4 0 
5 0 
6 0 
7 0 
8 0 
9 0 
10 0 

No entiendo de dónde viene el 50 y por qué hay una diferencia entre los 2 resultados. ¿Podría decirme cómo hacer que esta unión funcione en Doctrine?

+0

¿Cuál es la consulta exacta generada por la doctrina? Puedes verificarlo fácilmente usando el WDT de Symfony. También debe almacenar el número total de comentarios en la tabla 'Publicación' y en/disminuir cada vez que agrega/elimina un comentario. – Crozin

+0

Hola Crozin, es lo que estoy haciendo en realidad. Pero quiero hacer que esto funcione porque quiero agregar una afirmación como 'WHERE post.date>?' Para obtener las publicaciones 'más interesantes' de las últimas 24h, último día, último mes ...Estoy ejecutando estos comandos con 'app/console doctrine: query: dql' y' app/console doctrine: query: sql'. – Quentin

Respuesta

8

He hecho algunas pruebas y me encontré con que todo parece estar bien.

Video: id, title, ... 
Comment: id, video_id, content, ... 

El esquema de la base de datos es muy simple y creo que no hay necesidad de ninguna explicación.

#DQL: 
    SELECT v.id, COUNT(c.id) AS num 
    FROM Video v 
    JOIN v.comments c 
    GROUP BY v.id 
    ORDER BY num DESC 

#Generated SQL: 
    SELECT v0_.id AS id0, COUNT(v1_.id) AS sclr1 
    FROM video v0_ 
    INNER JOIN video_comment v1_ ON v0_.id = v1_.video_id 
    GROUP BY v0_.id 
    ORDER BY sclr1 DESC 

#Result set: 
    Array 
    (
     [0] => Array 
      (
       [id] => 148 
       [num] => 3 
      ) 

     [1] => Array 
      (
       [id] => 96 
       [num] => 2 
      ) 

     [2] => Array 
      (
       [id] => 111 
       [num] => 1 
      ) 

     [3] => Array 
      (
       [id] => 139 
       [num] => 1 
      ) 

    ) 

si selecciona todo Video objeto en lugar de su ID (v en lugar de v.id en SELECT cláusula) la consulta se ejecutará también. Por supuesto, en lugar del elemento id habrá un objeto Video en 0 elemento.

probado en Doctrina 2.1.0-DEV

0

EDITADO: Personas - Esta respuesta no es trabajo. Al menos puedes eliminar esto de posibles soluciones.

SELECT post, COUNT(comment.id) AS num 
FROM Entity\Post post 
LEFT JOIN post.comments comment 
GROUP BY post 

Usted fue la agrupación por post.id, no post

por cierto, esta es una suposición total. No sé DQL, pero sí sé Hibernate, y parece similar-ish. Si es incorrecto, eliminaré esta respuesta; házmelo saber mediante un comentario.

+0

Hola bohemio, agrupar por 'publicar' no mejora. Tengo exactamente la misma salida. – Quentin

-1

no sé DQL, y esto podría ser estúpido .... pero se ha publicado esto:

SELECT post, COUNT(comment.id) AS num 
FROM Entity\Post post 
LEFT JOIN post.comments comment 
GROUP BY post.id 

No deberías estar seleccionando post.id? Sé que suena raro, pero por lo que entiendo, select post es equivalente a select *. Sin embargo, en su salida, solo obtiene la columna de ID. Pensé que podría valer la pena señalarlo (incluso si no lo es).

/prepara para downvote