У меня есть много таблиц, которые выглядят так: (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;
Есть ли способ избежать увеличения количества подзапросов? Я полагаю, в конце концов, мое возражение носит эстетический характер, но из-за этого запросы трудно читать и трудно писать.