在SQL查询中限制某些属性

时间:2019-05-23 09:00:27

标签: mysql sql database

我正在建立图书馆数据库。我想编写一个查询,该查询返回每个类别的前5本图书,这意味着它必须返回每种类别中借用次数最多的5本书,以及它们被借阅的次数。

查询涉及以下表格:

图书(ISBN,书名,pubYear,numpages,pubName)
借入(会员ID,ISBN,copyNr,借入日期,返回日期)
属于(ISBN,类别名称)

我的方法如下:

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次。

2 个答案:

答案 0 :(得分:0)

在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

答案 1 :(得分:0)

使用功能行号,按类别划分。 然后 选择        * 从      (查询)作为测试 行号<= 5

请参阅以下链接。

How to return a incremental group number per group in SQL