3
t1

id | name | include
-------------------
1  | foo  |  true
2  | bar  |  true
3  | bum  |  false

t2

id | some | table_1_id
-------------------------
1  | 42   |     1
2  | 43   |     1
3  | 42   |     2
4  | 44   |     1
5  | 44   |     3

期望的输出:

name | count(some)
------------------
foo  | 3
bar  | 1

我目前通过查看其他解决方案获得的信息:

    SELECT      a.name, 
            COUNT(r.some)

FROM        t1 a
JOIN  t2 r on a.id=r.table_1_id
WHERE       a.include = 'true' 

GROUP BY    a.id,
            r.some;

但这似乎让我

name | count(r.some)
--------------------
foo  | 1
foo  | 1
bar  | 1
foo  | 1

我不是 sql 专家(我可以做简单的查询),所以我也在四处搜索,但找到的大多数解决方案都给了我这个结果。我可能错过了一些非常简单的东西。

4

2 回答 2

11

group by只需从子句中删除第二列

SELECT      a.name, 
            COUNT(r.some)    
FROM        t1 a
JOIN  t2 r on a.id=r.table_1_id
WHERE       a.include = 'true' 
GROUP BY    a.name

您想在聚合函数中使用的列,例如sum()orcount()必须被排除在group by子句之外。只将您想要唯一输出的列放在那里。

于 2013-07-18T16:59:27.113 回答
1

这是因为多列组要求所有列值相同。

有关更多信息,请参阅此链接。在多个列上使用 group by

实际上在您的情况下,如果有些相等,则 table_1_id 不相等(反之亦然)。所以不能发生分组。所以所有的都是单独显示的。

如果条目是这样的,

id | some | table_1_id
-------------------------
1  | 42   |     1
2  | 43   |     1
3  | 42   |     2
4  | 42   |     1

那么输出将是。

name | count
------------------
foo  | 2     (for 42)
foo  | 1     (for 43)
bar  | 1     (for 42)

实际上,如果你想像 Juergen 所说的那样在 1 列上分组,你可以r.some;从 groupby 子句中删除。

于 2013-07-18T17:11:26.863 回答