mysql - 限制 SQL 查询的某些属性
问题描述
我正在建立一个图书馆数据库。我想编写一个查询,返回每个类别的前 5 本书,这意味着它必须返回每个类别中借阅次数最多的 5 本书以及它们被借的次数。
该查询涉及以下表格:
图书 (ISBN, title,pubYear,numpages, pubName) 借阅
(memberID, ISBN, copyNr, date_of_borrowing, date_of_return)
belongs_to (ISBN, categoryName)
我的方法如下:
SELECT *
FROM(SELECT book.title, count(bo.ISBN) as Number_of_times_book_is_taken ,be.categoryName
FROM belong_to as be INNER JOIN borrows as bo ON be.ISBN = bo.ISBN INNER JOIN book ON bo.ISBN = book.ISBN
GROUP BY bo.ISBN
ORDER BY count(bo.ISBN) DESC) AS Popular
ORDER BY categoryName, Number_of_times_book_is_taken DESC
如果我想返回书名、书籍被使用的次数以及它们所属的类别,我认为这很好用。
但是,我想限制结果,以便每个类别只获得 5 本书。如果我使用LIMIT 5
我会限制整个结果,这不是我想要的。我试图限制每个 categoryNames 最多出现 5 次。
解决方案
在 mysql 8.0+ 版本中,您可以使用 row_number()
with cte as
(
SELECT book.title, count(bo.ISBN) as Number_of_times_book_is_taken ,
be.categoryName,
row_number() over(partition by be.categoryName order by count(bo.ISBN) desc) rn
FROM belong_to as be INNER JOIN borrows as bo
ON be.ISBN = bo.ISBN INNER JOIN book ON bo.ISBN = book.ISBN
GROUP BY be.categoryName,book.title
) select * from cte where rn<=5
推荐阅读
- vba - 向不同单元格之间移动的数据添加文本
- java - 向 List 添加新元素会替换以前的元素
- php - Wordpress 中管理员用户的仅查看模式
- javascript - 如何在 html 表格中的某个位置插入 's?
- ldap - python-ldap:仅从 LDAP 搜索中检索几个条目
- javascript - 如何检查 div 是否包含某些文本?
- javascript - UI5 应用程序(在 WebIDE 中):sap.m.ColumnListItem:根据一列中的值更改整行颜色:出了什么问题?
- c# - FileSystemWatcher.Created 无法正常工作
- python - 在 python 的单元测试中,我如何模拟一个里面有假图片的假文件夹?
- android - 导航控制器从 startDestination 片段导航获取异常