2013-04-11 10 views
6

Ich versuche eine jpql-Abfrage zu schreiben, um den Benutzer mit den meisten Kommentaren auszuwählen. Wenn zwei Benutzer die gleiche Anzahl von Kommentaren haben, möchte ich beide auswählen.JPQL mit Unterabfrage zur Auswahl der maximalen Anzahl

Ich versuchte dies, so etwas wie dieses:

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 

und diese:

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

Weder Ansatz funktioniert. Was muss ich hier machen?

+1

Wenn Sie sagen, nicht funktioniert, Sie meinen es ausgewählt nur ein Benutzer, wenn zwei Benutzer dieselbe Anzahl der Kommentare hatte? – Victor

+0

Können Sie versuchen: select * from (SELECT c.user, COUNT (c.id) als commentCount VON Kommentar c) s1, wo s1.commentCount = (select max (s2.coomentCount) von SELECT c.user , COUNT (c.id) als commentCount FROM Kommentar c) s2 – Victor

+0

Ich bekomme immer eine "konnte nicht ausführen Abfrage", weil es irgendwie falsch ist. Also an erster Stelle bekomme ich "Unbekannte Spalte" jobsCount "in Where-Klausel" und in der zweiten Stelle, dass die Gruppe von ist ungültig (wenn ich den HAVING-Teil hinzufügen). Aber mir ist nicht bewusst, wie ich eine funktionierende Version schreibe. Habe schon viele verschiedene Versionen ausprobiert. –

Antwort

0

Dies sollte funktionieren, wenn Sie Oracle verwenden:

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 
) 

Aber MySQL und SQL Server nicht verschachtelte Aggregatfunktionen, max(count(c.id)) in diesem Fall unterstützen. Es wird empfohlen, eine Unterabfrage zu verwenden, aber mit HQL können Sie keine Unterabfragen in einer from-Klausel haben. Also schlage ich vor, Sie tun dies manuell, d. H. Laden alle Benutzer:

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

und durchlaufen Sie die Liste. Hier

+0

Vielen Dank für die Antwort.Schadlich benutze ich MySQL und ich kann nur eine named Abfrage-Anweisung erstellen.Einige andere Tipps? –

+0

Sie können eine native Abfrage verwenden. – lunr

5

ist eine Lösung:

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

Vielen Dank für diese Antwort! –