2013-03-12 139 views
2

我有2個表(ENTRIES和USERS)通過id鏈接,我想從前5個用戶中選擇所有條目,然後按單個用戶的COUNT條目排序。SQL ORDER BY GROUP BY

USERS ENTRIES 

tom  entry1 
mary  entry2 
jane  entry3 
tom  entry4 
tom  entry5 

等等.... 顯示爲

USERS ENTRIES 

tom  entry1 
tom  entry4 
tom  entry5 
jane  entry3 
mary  entry2 

我此刻的代碼只是訂單減少的名字,但不通過條目

SELECT ENTRIES.entry, USERS.NAME FROM ENTRIES, USERS 
WHERE ENTRIES.USER_ID = USERS.ID 
ORDER BY USERS.NAME 
+0

您正在使用什麼RDBMS? – Taryn 2013-03-12 18:55:12

+0

我使用的是Oracle 11g – 2013-03-12 19:02:29

回答

3

由於合計表您正在使用Oracle,您可以使用窗口函數來獲取每個用戶的總數:

SELECT e.entry, 
    u.NAME, 
    count(*) over(partition by u.name) Total 
FROM ENTRIES e 
INNER JOIN USERS u 
    ON e.USER_ID = u.ID 
ORDER BY total desc, u.NAME 

請參閱SQL Fiddle with Demo

然後,如果您只想返回前5行,那麼你可以使用:

select entry, 
    name, 
    total 
from 
(
    SELECT e.entry, 
    u.NAME, 
    count(*) over(partition by u.name) Total, 
    rownum rn 
    FROM ENTRIES e 
    INNER JOIN USERS u 
    ON e.USER_ID = u.ID 
) 
where rn <= 5 
ORDER BY total desc, NAME 

SQL Fiddle with Demo

+0

非常整潔的謝謝。這很好地對排序問題進行了排序。剛剛看到了前五名。再次感謝! – 2013-03-12 19:23:35