【发布时间】:2017-01-08 10:13:10
【问题描述】:
我有一个多对多表,其结构大致如下:
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 有两行。到目前为止,一切都很好。但不是我在这里寻找的。p>
我需要的是:对于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
——我承认这让我有点困惑。
可以吗?
(奇怪的是,我找不到这个问题已经被问过了——这肯定以前一定被问过?也许我只是在搜索查询的措辞上很糟糕……)
【问题讨论】:
-
如果你按 id 分组,你会得到 3 行。在这里帮不了你
-
@Michael 是的,完全正确。你会得到三行,其中一行有
COUNT(id) = 4,两行有COUNT(id) = 2。我要做的是,对于COUNT(id)的每个值,返回具有该值的行数。 -
给我看看你的 sql 老兄
-
@Michael SQL 在过去 30 分钟内更改了大约 50 次,大多数排列导致各种语法错误——这是问题的一部分。我现在更新了问题以更详细地解释。
-
也许
SELECT id, COUNT(id) as idcnt ,COUNT(*) as rowcnt FROM table GROUP BY id
标签: php mysql sql group-by aggregate-functions