2013-04-11 11 views
6

Kullanıcıya en çok yorumu içeren bir jpql sorgu yazmaya çalışıyorum. İki kullanıcının aynı sayıda yorumu varsa, ikisini de seçmek istiyorum.JPQL alt sorgu ile maksimum sayı seçmek için

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 

ve bu:

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

İki yaklaşım çalışır

Ben böyle bir şey denedim. Burada ne yapmam gerekiyor?

+1

, iki kullanıcıları yorumların aynı # varken sadece bir kullanıcıyı seçilen demek: Burada – Victor

+0

denemek Can: select * s1 nerede ( Yorum c DAN commentCount olarak c.user, COUNT (c.id) SEÇ) den s1.commentCount = (seçmek max (s2.coomentCount) SELECT'in dan c.user , COUNT (c.id) olarak yorumCount FROM Yorum c) s2 – Victor

+0

Her zaman bir "yanlış sorgulama çünkü" sorgu yürütemedi "alıyorum. Yani ilk etapta "Bilinmeyen sütun" jobsCount "cümlede nerede" ve ikinci grupta ise (HAVING kısmını eklediğimde) geçersiz. Ama çalışan bir versiyonu nasıl yazdığımı bilmiyorum. Zaten çok farklı versiyonları denedim. –

cevap

0

Eğer Oracle kullanıyorsanız bu çalışması gerekir:

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 
) 

Ama MySQL ve SQL Server yuvalanmış toplu işlevleri, bu durumda max(count(c.id)) desteklemez. Bir alt sorgunun kullanılması önerilir, ancak HQL ile bir yan cümlede alt sorgulara sahip olamazsınız. Bu yüzden, bunu manuel olarak yapmanızı öneririm, yani tüm kullanıcıları yükleyin:

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

ve listeden geçiş yapın. Eğer işe yaramadı derken

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

Cevabınız için teşekkürler .. Üzgünüz, MySQL kullanıyorum ve sadece bir tane adlı bir deyim oluşturabilirim.Tüm ipuçları… –

+0

Yerel bir sorgu kullanabilirsiniz – lunr

5

bir çözüm mü?
+0

Bu yanıt için teşekkürler! –