Как получить гистограмму подсчетов из соединения таблица без использования подзапроса?

У меня есть много таблиц, которые выглядят так: (id, user_id, object_id). Меня часто интересует вопрос «сколько пользователей имеет один объект? У скольких - два и т. Д.» и хотел бы увидеть распределение.

Очевидный ответ на это выглядит так:

select x.ucount, count(*) 
from (select count(*) as ucount from objects_users group by user_id) as x 
group by x.ucount 
order by x.ucount;

Это дает такие результаты:

ucount | count
-------|-------
1      | 15
2      | 17
3      | 23
4      | 104
5      | 76
7      | 12

Использование подзапроса здесь кажется мне неэлегантным, и я хотел бы выяснить, как создать тот же результат без. Далее, если вопрос у вас повторная попытка спросить немного сложнее, это становится беспорядочным, передавая больше информации из подзапроса. Например, если вы хотите, чтобы данные были дополнительно сгруппированы по дате создания пользователя:

select 
    x.ucount, 
    (select cdate from users where id = x.user_id) as cdate, 
    count(*) 
from (
    select user_id, count(*) as ucount 
    from objects_users group by user_id
) as x 
group by cdate, x.ucount,  
order by cdate, x.ucount;

Есть ли способ избежать увеличения количества подзапросов? Я полагаю, в конце концов, мое возражение носит эстетический характер, но из-за этого запросы трудно читать и трудно писать.

7
задан Emmett Shear 21 March 2011 в 05:03
поделиться