基于给定数据表,如何编写SQL查询找出最受读者欢迎的作者?
如何通过SQL查询最受读者欢迎的作者信息?
要找出最受读者欢迎的作者,核心思路是统计每个作者的书籍被借阅的总次数,然后按借阅次数从高到低排序。结合你提供的两张数据表,我来一步步拆解实现方案:
先明确表关联逻辑
假设你提到的两张表分别命名为:
book_catalog:包含书目基础信息(BibNum、Author、Title等)checkout_records:包含借阅记录(BibNum、CheckoutDateTime等)
两张表通过BibNum字段关联(这里默认BibNum是书目编号——如果实际是读者账号的话,可能需要重新确认关联逻辑,因为这样无法直接关联到作者信息)。
基础查询语句(Top N受欢迎作者)
下面是最基础的实现,会统计每个作者的总借阅次数,并返回排名靠前的作者:
SELECT bc.Author, COUNT(cr.CheckoutDateTime) AS total_checkouts FROM book_catalog bc INNER JOIN checkout_records cr ON bc.BibNum = cr.BibNum GROUP BY bc.Author ORDER BY total_checkouts DESC LIMIT 10; -- 这里可以修改数字,比如取Top5或Top20
语句细节解释
INNER JOIN:只保留有对应借阅记录的书目,确保我们统计的是真正被读者借阅过的作者COUNT(cr.CheckoutDateTime):统计每个作者对应的有效借阅次数(用CheckoutDateTime而非*是为了排除可能的NULL记录,比如未完成的借阅)GROUP BY bc.Author:按作者分组,让聚合函数COUNT能计算每个作者的总借阅量ORDER BY total_checkouts DESC:按借阅次数从高到低排序,让最受欢迎的作者排在前面LIMIT:控制返回的作者数量,按需调整即可
处理特殊场景
如果遇到作者名称格式不统一的问题(比如同一作者被记录为"J.K. Rowling"和"JK Rowling"),可以先清洗作者名称再统计:
SELECT -- 去除点号并修剪空格,统一作者名称格式 TRIM(REPLACE(bc.Author, '.', '')) AS cleaned_author, COUNT(cr.CheckoutDateTime) AS total_checkouts FROM book_catalog bc INNER JOIN checkout_records cr ON bc.BibNum = cr.BibNum GROUP BY cleaned_author ORDER BY total_checkouts DESC LIMIT 10;
如果需要包含从未被借阅过的作者(虽然需求是找最受欢迎的,但可以作为扩展),可以把INNER JOIN换成LEFT JOIN,并调整统计逻辑:
SELECT bc.Author, COUNT(cr.CheckoutDateTime) AS total_checkouts FROM book_catalog bc LEFT JOIN checkout_records cr ON bc.BibNum = cr.BibNum GROUP BY bc.Author ORDER BY total_checkouts DESC;
这种情况下,未被借阅的作者总次数会显示为0,排在列表末尾。
内容的提问来源于stack exchange,提问作者Gideok Seong
相关产品推荐
相关产品推荐

