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

标签 php mysql sql group-by aggregate-functions

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

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 (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(字段) 和分组行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39256075/

相关文章:

sql - 表中外键列位置的最佳实践

php - 如何使用 PHP MySQL 在 AJAX 脚本中获取数据库值

php - 对 PHP 脚本的更改不会执行

sql - 用于排除特定电子邮件域的 Where 子句

php - 用户点击弹出窗口上的保存按钮刷新主窗口

php - 在页面之间传递数据?

c# - ORM 的哪些选择允许接近 'flick a switch' 在...SQL Server/SQL Azure 和 PostgreSQL/'Cloud' PostgreSQL 之间更改 RDBMS

php - 作为数组的一部分从 PHPUnit Test 返回参数

php - 让 json 中的每个 "li"成为它自己的链接?

php - 用户注册mysql之间的平均时间