[英](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.