繁体   English   中英

(MySQL)按字段分组,然后选择COUNT(字段)和分组的行数

[英](MySQL) Group by field and select both COUNT(field) and number of grouped rows

我有一个具有这种结构的多对多表:

id  | obj
----+---------
1   | 27
1   | 42
2   | 32
2   | 42
2   | 162
2   | 89
3   | 2
3   | 209

本质上,该表将任意数量的对象( obj )与任意数量的集合( id )关联。

我想SELECT从该表的方式,将返回的行数在GROUP BY BY子句分组id也可以由每个组中的行数分组分组的行数。

如果我只是SELECT COUNT(id) FROM table GROUP BY id执行SELECT COUNT(id) FROM table GROUP BY id ,我自然会得到以下信息:

id  | COUNT(id)
----+---------
1   | 2
2   | 4
3   | 2

也就是说,有COUNT(id) = 4一行,有COUNT(id) = 2两行。 到现在为止还挺好。 但不是我在这里寻找的东西。

我需要的是: 对于 COUNT(id)返回的每个不同的值 COUNT(id)在本例中为2和4),选择COUNT(id)以及在其COUNT(id)列中匹配该值的行数(在此例中)情况2和1:分别有2行的COUNT(id) = 2和1行的COUNT(id) = 4 )。

换句话说,从上表中,我想要这样:

id_cnt | grp_cnt
-------+---------
2      | 2
4      | 1

–由于按id对表进行分组,您将获得行,其中COUNT(id)为2( id 1和3); 排,其中COUNT(id)为4( id 2)。

但是,尽我所能,打乱了我的大脑,我无法在一个查询中找到一种方法来做到这一点。

我最接近我认为有意义的事情是:

SELECT COUNT(*), id_cnt FROM table JOIN (SELECT COUNT(id) id_cnt FROM table GROUP BY id) a

–但这给出了:

count(*) | id_cnt
---------+---------
21100    | 2

–我承认这让我有些困惑。

能做到吗

(我感到奇怪的是,我找不到已经问过的问题-当然必须已经问过这个问题?也许我只是对搜索查询的措辞很差……)

您可以在第一个分组查询周围添加另一个分组级别。

SELECT id_cnt, COUNT(*) AS grp_cnt 
FROM (
    SELECT COUNT(*) AS id_cnt 
    FROM test.test GROUP BY id) id_cnts
GROUP BY id_cnt;

您可以通过id通过这种方式获取cont

  select id, count(*) as ctn
  from table 
  group by id

和相同的计数与第二级计数

 select ctn, count(*)
 from ( select id, count(*) as ctn
        from table 
        group by id) t
 group by ctn

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM