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专家(我可以做简单的查询)所以我也在谷歌搜索,但找到我发现的大多数解决方案给我这个结果。我可能错过了一些非常简单的事情。
答案 0 :(得分:10)
只需从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()
或count()
等聚合函数中使用的列必须省略group by
子句。只将列放在那里你想要独特输出。
答案 1 :(得分:1)
这是因为多列组要求所有列值相同。
有关详细信息,请参阅此链接。Using group by on multiple columns
实际上在你的情况下,如果有些相等,则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列进行分组,你可以从groupby子句中删除r.some;
。