加入并计入DQL

问题描述

| 我有一个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中起作用吗?     

解决方法

        我进行了一些测试,发现一切似乎都很好。
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(在
SELECT
子句中用
v
而不是
v.id
),查询也将执行。当然,在第0个元素下方将有一个
Video
对象,而不是
id
元素。 在教义2.1.0-DEV上测试     ,        编辑:人-此答案不起作用。至少您可以从可能的解决方案中消除这一点。
SELECT post,COUNT(comment.id) AS num
FROM Entity\\Post post
LEFT JOIN post.comments comment
GROUP BY post
您是按照
post.id
而不是
post
分组 顺便说一句,这是一个总的猜测。我不了解DQL,但我确实知道休眠状态,而且看起来类似。如果不正确,我将删除此答案-通过评论让我知道。     ,        我不知道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列。我认为可能值得注意(即使不是)。 /准备投票