2013-03-12 9 views
2

У меня есть 2 таблицы (ЗАПИСИ И ПОЛЬЗОВАТЕЛИ), связанные идентификатором, я хочу выбрать все записи только из 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

+0

Я использую Oracle 11g –

ответ

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

Очень аккуратное спасибо. Это красиво упорядочило проблему заказа. Только что увидел верхнюю часть 5 тоже. Еще раз спасибо! –