SQL如何从关联的书籍与出版商表中查询各出版商营收最高的书籍
问题原因
你当前的查询存在两个核心问题:
- 拼写错误:
b.titel应为b.title - 未正确实现分组取top1逻辑:仅用
MAX()聚合却没有配套的分组逻辑,且直接查询非聚合的title字段,返回的条目和最大值没有对应关系,结果不符合SQL标准,取值不确定。
解决方案
方案1:使用窗口函数(兼容MySQL 8.0+/PostgreSQL/SQL Server等所有主流新版数据库)
这是实现分组取最高值最简洁的方案:
SELECT title, publisher FROM ( SELECT b.title, p.name AS publisher, -- 按出版商分组,按营收倒序排序,排名1即为该出版商最高营收书籍 RANK() OVER (PARTITION BY p.code ORDER BY b.price * b.sold DESC) AS rank_num FROM Publisher p INNER JOIN Book b ON p.code = b.publisher ) AS temp WHERE rank_num = 1;
如果同一个出版商有多本营收相同的最高值书籍,RANK()会返回全部符合条件的条目;如果只需要返回1本,把RANK()换成ROW_NUMBER()即可。
方案2:嵌套查询(兼容所有旧版本数据库)
先聚合计算每个出版商的最高营收,再关联回原表匹配对应书籍信息:
SELECT b.title, p.name AS publisher FROM Publisher p INNER JOIN Book b ON p.code = b.publisher INNER JOIN ( SELECT publisher, MAX(price * sold) AS max_revenue FROM Book GROUP BY publisher ) AS max_pub ON b.publisher = max_pub.publisher AND b.price * b.sold = max_pub.max_revenue;
如果你的数据库支持行级子查询,也可以用更简洁的写法:
SELECT b.title, p.name AS publisher FROM Publisher p INNER JOIN Book b ON p.code = b.publisher WHERE (b.publisher, b.price * b.sold) IN ( SELECT publisher, MAX(price * sold) AS max_revenue FROM Book GROUP BY publisher );
两种方案都可以返回你期望的结果:
| title | publisher |
|---|---|
| book2 | BBook |
| book3 | ABook |
内容的提问来源于stack exchange,提问作者Gerald
相关产品推荐
相关产品推荐

