sql - 为什么 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
?谢谢你的帮助。
解决方案
首先,您应该使用合格的列引用编写查询,以便更容易理解:
SELECT a.name, COUNT(*)
FROM books b JOIN
authors a
ON b.author_id = a.id
GROUP BY b.author_id;
为什么这不起作用?显然SELECT
和GROUP 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.name
在GROUP BY
子句中。
推荐阅读
- python - pip 和安装 mysql-python 时出错
- sql - Sql Table 从 Postgres 函数的结果中选择
- python - 获取 Pandas 中每行 N Max/Min 值的列名
- solr - Solr - 从索引数据中带回片段
- javascript - 如何在子组件的材料输入上使用 ngIf 而不会得到 ExpressionChangedAfterItHasBeenCheckedError
- java - 如何从结果集中获取单行
- javascript - 如何在json对象中找到从开始节点到结束的最近邻居
- python - ModuleNotFoundError:没有名为“未来”的模块
- kendo-ui - 过滤器列表完成时,Kendo Grid MVC 不遵守过滤器顺序
- skbio - 使用 skbio 0.5.4 中的 smith-waterman 时出错