2013-04-11 14 views
6

Sto provando a scrivere una query jpql per selezionare l'utente con il maggior numero di commenti. Se due utenti hanno lo stesso numero di commenti, voglio selezionarli entrambi.JPQL con sottoquery per selezionare il conteggio massimo

ho provato questo, qualcosa di simile:

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 

e questo:

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

Né approccio funziona. Cosa devo fare qui?

+1

Quando si dice non ha funzionato, è significa che selezionato un solo utente quando due utenti hanno lo stesso # di commenti? – Victor

+0

Puoi provare: select * from (SELECT c.user, COUNT (c.id) come commentCount DA commento c) s1 dove s1.commentCount = (selezionare max (s2.coomentCount) dal SELEZIONA c.user , COUNT (c.id) come commentoCunto DA Commento c) s2 – Victor

+0

Ricevo sempre un messaggio "Impossibile eseguire query" perché è in qualche modo errato. Quindi in primo luogo ottengo "Colonna sconosciuta" jobsCount "nella clausola where" e nel secondo che il gruppo by non è valido (quando aggiungo la parte HAVING). Ma non sono a conoscenza di come scrivere una versione funzionante. Ho già provato molte versioni differenti. –

risposta

0

Questo dovrebbe funzionare se si utilizza 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 
) 

Ma MySQL e SQL Server non supportano funzioni di aggregazione nidificate, max(count(c.id)) in questo caso. Si consiglia di utilizzare una sottoquery, ma con HQL non è possibile avere sottoquery in una clausola from. Quindi suggerisco di farlo manualmente, ovvero caricare tutti gli utenti:

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

e scorrere l'elenco.

+0

Grazie per la risposta, purtroppo sto usando MySQL e posso creare solo una dichiarazione di interrogazione con nome Altri suggerimenti –

+0

È possibile utilizzare una query nativa – lunr

5

Ecco una soluzione:

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

Grazie per questa risposta! –

Problemi correlati