当前位置: 首页 > 知识库问答 >
问题:

限制SQL查询的某些属性

水渊
2023-03-14

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

查询涉及以下表:

Book(ISBN, title, pubYork, numpage, pubName)
borrows(memberID, ISBN, Copnr,date_of_borrowing,date_of_return)
belongs_to(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

如果我想返回书籍的标题、书籍被拿走的次数以及它们所属的类别,我认为这很好。

但是,我想限制resutls,以便每个类别只能获得5本书。如果我使用LIMIT 5,我会限制整个结果,这不是我想要的。我正在尝试限制每个分类名称最多出现5次。

共有2个答案

太叔凌龙
2023-03-14

使用函数行号,按类别分区。然后从(查询)中选择*作为测试位置行号

请参见下面的链接。

如何在SQL中为每个组返回增量组号

祝允晨
2023-03-14

在mysql 8.0版本中,可以使用row\u 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
 类似资料:
  • 问题内容: 我非常确定我们不能将LIMIT子句用于我想做的事情-因此想确定是否还有其他方法可以实现此目的。 我有一个表,其中捕获了哪个用户访问了哪个商店。每次用户访问商店时,都会在此表中插入一行。 一些领域是 shopping_id(primary key) store_id user_id 现在,我想要的是-对于给定的一组商店,找到访问该商店的最大次数的前5位用户。 我可以一次在1个商店中进行以

  • 问题内容: 我想知道是否可以限制SQL请求的结果? 例如,最多只返回以下内容的50行: 谢谢。 问题答案: 是的,这是可能的。这在数据库引擎之间有所不同。 Postgres: SQL Server: …

  • 问题内容: 我在这里发布了有关绑定gridview的问题-将GridView与许多记录绑定在一起,同时具有许多可见记录。通过实施答案,性能影响已从20秒逐渐降低到2秒,但我仍然知道可以将其降低到更大的极限。 像-当我一次从数据库中获取说50条记录(客户)时,它有一列从“订单”表中获取与该客户相对应的订单数(只是不完整记录)。因此,它对SQL Server进行了50次查询,以获取50个客户的数据。有

  • 问题内容: 如何限制JPQL命名查询的选择查询?我需要在查询级别本身而不是在Java层中完成限制!!!我正在尝试使用 但徒劳!!! 请建议 问题答案: 没有提供限制查询的机制。这通常是通过使用上的方法来实现的。如果必须避免在Java代码中指定此内容,则可以在包含查询并执行限制的数据库中进行查看。然后像将表一样将实体映射到此视图。 例:

  • 问题内容: 我正在构建一个小界面,希望用户能够写出他们的 整个 sql语句,然后查看返回的数据。但是,我不希望用户能够做任何有趣的事情,即。实际上,我希望用户能够做的唯一一件事就是运行语句。我知道没有特定的SQLite用户,所以我在考虑要制定的一套规则来拒绝某些查询。也许是正则表达式字符串之类的东西(正则表达式使我有些害怕)。关于如何做到这一点的任何想法? 问题答案: 我可以为您的问题建议另一种方

  • 我对DynamoDB上的查询/扫描限制有疑问。 我的表有1000条记录,对所有记录的查询都返回50个值,但是如果我把设为5,这并不意味着查询将返回前5个值,它只是说对5个项目的查询表(以任何顺序,所以它们可能是非常旧的项目或新的项目),所以我有可能在查询中得到0个项目。如何实际获得查询的最新5项?我需要设置一个为5(数字是例子),因为查询/扫描更多的项目会很昂贵。 该查询具有此输入 我的表的索引是