SQL SELECT查询仅返回1行,如何获取指定3个活动的名称及统计次数
问题根因
你现在查询只返回1行的核心原因是没有对活动字段做分组聚合,另外隐式表连接的写法也存在逻辑隐患。
- 你用了聚合函数
count(),但没有指定GROUP BY子句按活动维度拆分统计结果,数据库会默认把所有符合筛选条件的行合并为1行,只会返回第一个匹配到的活动名称,计数是三个活动的总出现次数,和你当前的现象完全吻合。 - 你用逗号分隔两个表的写法属于隐式内连接,没有明确声明两个表的关联条件,很容易产生笛卡尔积导致计数不准,建议改成显式JOIN声明关联关系。
修正后的SQL语句
SELECT a.name, COUNT(pai.activity_id) AS activity_count FROM activity a INNER JOIN person_activity_interval pai ON a.id = pai.activity_id WHERE pai.oib IN ( SELECT oib FROM person WHERE living_id IN ( SELECT id FROM living WHERE country = 'Poland' ) ) AND a.id IN (6,7,8) GROUP BY a.id, a.name ORDER BY a.id;
修正说明
- 用显式
INNER JOIN关联两个表,明确activity的id和person_activity_interval的activity_id是关联字段,逻辑更清晰 - 简化了筛选条件,直接用
a.id IN (6,7,8)就能匹配你要的三个活动,不需要写多层OR判断 - 新增
GROUP BY a.id, a.name,按活动维度拆分统计结果,每个活动都会单独返回一行名称和对应的出现次数 - 给count结果加了别名
activity_count,可读性更好
内容的提问来源于stack exchange,提问作者Andrija Dujak
相关产品推荐
相关产品推荐

