2011-06-13 87 views
6

我有一個MySQL命令,我無法在DQL中找到等價物。我正在嘗試獲取評論最多的帖子。下面是MySQL命令:加入並在DQL中計數

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個結果之間存在差異。你能告訴我如何使這種聯合工作在教義中?

+0

什麼是由學說產生準確的查詢?您可以使用Symfony的WDT輕鬆檢查它。你也應該在'Post'表中存儲所有評論數量,並且每當你添加/刪除一個評論時就將其存入/減少。 – Crozin 2011-06-13 23:36:52

+0

嗨Crozin,這是我在做什麼。但我想做這個工作,因爲我想添加一個像'WHERE post.date>?'語句來獲取最後24小時,最後一天,上個月的「hotest」帖子......我用'app/console doctrine:query:dql'和'app/console doctrine:query:sql'運行這些命令。 – Quentin 2011-06-14 01:07:38

回答

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,而不是在SELECT條款v.id)查詢將執行爲好。當然,代替id元素,將會有一個Video對象在和元素之下。

測試在原則2.1.0-DEV

0

EDITED:人 - 這個答案確實是不是工作。至少你可以從可能的解決方案中消除這一點。

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

你被post.id分組,而不是post

順便說一句,這是一個總的猜測。我不知道DQL,但我知道Hibernate,它看起來很相似。如果這是錯誤的,我會刪除這個答案 - 讓我通過評論知道。

+0

嗨波希米亞人,由'post'分組並不會好起來。我有完全相同的輸出。 – Quentin 2011-06-16 00:23:22

-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列。我認爲這可能值得注意(即使它不是)。

/準備downvote