You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL如何从关联的书籍与出版商表中查询各出版商营收最高的书籍

问题原因

你当前的查询存在两个核心问题:

  1. 拼写错误:b.titel 应为 b.title
  2. 未正确实现分组取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
);

两种方案都可以返回你期望的结果:

titlepublisher
book2BBook
book3ABook

内容的提问来源于stack exchange,提问作者Gerald

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:45:10