如何在不使用子查询的情况下从连接表中获取计数直方图?

Emm*_*ear 7 sql subquery

我有很多看起来像这样的表:(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;
Run Code Online (Sandbox Code Playgroud)

这会产生如下结果:

ucount | count
-------|-------
1      | 15
2      | 17
3      | 23
4      | 104
5      | 76
7      | 12
Run Code Online (Sandbox Code Playgroud)

在这里使用子查询对我来说感觉不优雅,我想知道如何在没有的情况下产生相同的结果.此外,如果您要问的问题稍微复杂一点,那么将更多信息传递出子查询会变得更加混乱.例如,如果您希望按用户的创建日期进一步分组数据:

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;
Run Code Online (Sandbox Code Playgroud)

有没有办法避免子查询爆炸?我想最终我的反对意见是审美的,但它使查询难以阅读并且难以编写.

Mic*_*ter 1

我认为无论您的 RDBMS 是什么,子查询都是执行此操作的正确方法。为什么会显得不优雅呢?

对于第二个查询,只需users像这样连接表:

SELECT
 x.ucount,
 u.cdate,
 COUNT(*)
FROM (
 SELECT
  user_id,
  COUNT(*) AS ucount
 FROM objects_users
 GROUP BY user_id
) AS x
LEFT JOIN users AS u
 ON x.user_id = u.id
GROUP BY u.cdate, x.ucount
ORDER BY u.cdate, x.ucount
Run Code Online (Sandbox Code Playgroud)