首页 > 解决方案 > 限制 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 次。

标签: mysqlsqldatabase

解决方案


在 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

推荐阅读