我有一个多对多表,其结构大致如下:
id | obj
----+---------
1 | 27
1 | 42
2 | 32
2 | 42
2 | 162
2 | 89
3 | 2
3 | 209
本质上,该表将任意数量的对象 (obj
) 与任意数量的集合 (id
) 相关联。
我正在尝试从此表中SELECT
,其方式将返回按id
分组的GROUP BY
子句中的行数,以及还有按每组中的行数分组的分组行数。
如果我简单地执行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)
返回的每个不同值(本例中为 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
s 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;
关于php - (MySQL) 按字段分组并选择 COUNT(字段) 和分组行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39256075/