Присоединяйтесь и считайте в DQL - PullRequest
6 голосов
/ 13 июня 2011

У меня есть команда MySQL, и я не могу найти эквивалент в DQL. Я пытаюсь получить список самых комментируемых сообщений. Вот команда MySQL:

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

Вот результат:

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

В DQL должно быть:

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

Но это дает:

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

Я не понимаю, откуда берется 50 и почему есть разница между двумя результатами. Не могли бы вы рассказать мне, как заставить это объединение работать в Doctrine?

Ответы [ 3 ]

8 голосов
/ 17 июня 2011

Я провел несколько тестов и обнаружил, что все в порядке.

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

Схема базы данных очень проста, и я думаю, что никаких объяснений не требуется.

#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
            )

    )

Если вы выберете весь объект Video вместо его идентификатора (v вместо v.id в предложении SELECT), запрос также будет выполнен.Конечно, вместо элемента id будет объект Video под элементом 0 th .

Проверено на Doctrine 2.1.0-DEV

0 голосов
/ 16 июня 2011

Я не знаю DQL, и это может быть глупо .... но вы опубликовали это:

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

Разве вы не выбираете post.id?Я знаю, это звучит странно, но из того, что я понимаю, select post эквивалентно select *.Тем не менее, в вашем выводе вы получаете только столбец идентификатора.Я подумал, что это стоит отметить (даже если это не так).

/ готовится к понижению

0 голосов
/ 16 июня 2011

РЕДАКТИРОВАНИЕ : Люди - Этот ответ не работает.По крайней мере, вы можете исключить это из возможных решений.

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

Вы группировали по post.id, а не post

кстати, это полное предположение.Я не знаю DQL, но я знаю hibernate, и похоже, что это похоже на иш.Если это не так, я удалю этот ответ - сообщите мне по комментарию.

...