首页 > 解决方案 > 为什么 group by 语句不返回正确的行?

问题描述

我正在阅读教程,但我不明白为什么我的查询不起作用。

我有 2 张桌子:

authors

ID 姓名
1 JK罗琳
2 斯蒂芬·金
3 阿加莎克里斯蒂
4 苏斯博士

books

ID 标题 author_id
1 密室 1
2 阿兹卡班的囚徒 1
3 黑暗之塔 2
4 林克斯谋杀案 3
5 在 Styles 做事 3
6 戴帽子的猫 4

任务是编写一个查询,打印作者的姓名和他们创作的书籍数量。

我的解决方案是这个:

SELECT name, COUNT(*)   
FROM books
JOIN authors ON books.author_id = authors.id
GROUP BY author_id

但是,结果中没有名称行。我知道正确的解决方案是GROUP BY name,但是我不明白为什么我不能分组author_id?谢谢你的帮助。

标签: sqlpostgresql

解决方案


首先,您应该使用合格的列引用编写查询,以便更容易理解:

SELECT a.name, COUNT(*)   
FROM books b JOIN
     authors a
     ON b.author_id = a.id
GROUP BY b.author_id;

为什么这不起作用?显然SELECTGROUP BY列是不同的!他们甚至不是来自同一张桌子。

以下可能有效:

SELECT a.name, COUNT(*)   
FROM books b JOIN
     authors a
     ON b.author_id = a.id
GROUP BY a.id;

如果authors.id被声明为主键或unique- 这很可能会起作用。这是因为一种称为功能依赖的功能,当唯一键或主键位于GROUP BY键中时,它适用于要引用的任何列。

但是,如果没有这样的显式声明,那么就需要a.nameGROUP BY子句中。


推荐阅读