2013-04-11 141 views
6

我想寫一個jpql查詢來選擇最多評論的用戶。如果兩個用戶有相同數量的評論,我想同時選擇這兩個評論。JPQL與子查詢選擇最大數

我想這一點,是這樣的:

SELECT 
    c.user, COUNT(c.id) as commentCount 
FROM 
    Comment c 
WHERE 
    commentCount = (SELECT MAX(SIZE(user.comments)) FROM User user) 
GROUP BY 
    c.user 

這:

SELECT 
    c.user 
FROM 
    Comment c 
GROUP BY 
    c.user 
HAVING 
    COUNT(c) = (SELECT MAX(SIZE(user.comments)) FROM User user) 

這兩種方法都不適用。我需要在這裏做什麼?

+1

當你說沒有工作,你的意思是隻選擇了一個用戶,當兩個用戶得到的評價一樣#? – Victor 2013-04-11 19:51:31

+0

你可以試試: SELECT * FROM(SELECT c.user,COUNT(c.id)作爲commentCount FROM 註解C1)S1,其中s1.commentCount =(選擇最大(s2.coomentCount)從SELECT c.user ,COUNT(c.id)作爲commentCount FROM 評論c)s2 – Victor 2013-04-11 20:08:15

+0

我總是得到一個「無法執行查詢」,因爲它以某種方式錯誤。因此,首先,我在「where子句」中得到「未知列」jobsCount,在第二個中,group by是無效的(當我添加HAVING部分時)。但我不知道我如何編寫工作版本。已經嘗試了許多不同的版本。 – 2013-04-11 20:09:19

回答

0

這應該,如果你使用的是Oracle工作:

select u from User u where size(u.comments) = (
    select max(count(c.id)) 
    from User u2 inner join u2.comments c 
    group by u2.id 
) 

但MySQL和SQL服務器不支持嵌套聚合函數,在這種情況下max(count(c.id))。建議使用子查詢,但對於HQL,您不能在from子句中使用子查詢。因此,我建議您手動執行此操作,即加載所有用戶:

select u, size(u.comments) 
from User u 

並循環顯示列表。

+0

感謝您的回答。不幸的是,我使用的MySQL和我只能創建一個命名查詢語句。其他技巧? – 2013-04-11 22:44:07

+0

您可以使用本機查詢 – lunr 2013-04-11 22:50:59

5

這裏是一個解決方案:

SELECT 
    u 
FROM 
    User u 
WHERE 
    u.comments.size = (SELECT MAX(u2.comments.size) FROM User u2) 
+0

感謝您的回答! – 2017-09-20 08:04:03