gpt4 book ai didi

php - (MySQL) 按字段分组并选择 COUNT(field) 和分组行数

转载 作者:行者123 更新时间:2023-11-29 01:36:58 25 4
gpt4 key购买 nike

我有一个多对多表,其结构大致如下:

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

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

我正在尝试从该表中SELECT 以一种方式返回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) 返回的每个不同值(在本例中为 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 (ids 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(field) 和分组行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39256075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com