问题描述
|
我有一个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列。我认为可能值得注意(即使不是)。
/准备投票