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