6

我有一个 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 的来源以及为什么 2 个结果之间存在差异。你能告诉我如何让这个加入在 Doctrine 中工作吗?

4

3 回答 3

8

我做了一些测试,我发现一切似乎都很好。

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对象而不是其 id(v而不是v.idinSELECT子句),查询也将执行。当然,在第 0id元素下会有一个Video对象而不是元素。

在 Doctrine 2.1.0-DEV 上测试

于 2011-06-16T22:50:28.097 回答
0

编辑:人 - 这个答案不起作用。至少您可以从可能的解决方案中消除这种情况。

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

你是按 分组post.id,而不是post

顺便说一句,这是一个完全的猜测。我不知道 DQL,但我知道 hibernate,而且看起来很相似。如果有误,我将删除此答案-通过评论告诉我。

于 2011-06-15T22:33:13.297 回答
-1

我不知道 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 *. 然而,在您的输出中,您只得到 ID 列。我认为这可能值得注意(即使不是)。

/准备投反对票

于 2011-06-16T03:53:52.467 回答