【问题标题】:SQL query with offset and fetch带有偏移量和获取的 SQL 查询
【发布时间】:2019-04-07 21:48:41
【问题描述】:

我正在创建一个基本的 ASP.net 博客主页。 我有两个表(结构如下)。我需要这些表中的数据进行分页,所以我在查询本身中使用了 offsetskip

这些表格是:

表格 - 博客

Id(primary),
Description,
Data,
CreatedById,
CreatedDate,
ImageUrl,
IsDeleted,
Tags,
StatusId(value = 1 for draft and 2 for publish)

表格 - BlogCategories

Id,
BlogId(foreign key to table 1),
CategoryId

这些表中已有数据。我正在使用以下查询来获取数据

Select *
from Blog b inner join
     BlogCategories bc
     on b.Id = bc.BlogId
where b.StatusId = 2 and bc.CategoryId = 2 and b.IsDeleted = 0
ORDER BY b.CreatedDate desc
OFFSET     73 ROWS      
FETCH NEXT 9 ROWS ONLY;

此查询返回 0 行,但如果我从 where 子句中删除 statusId 和 CategoryId,查询将返回一定数量的行。

预期结果是:

我做错了什么还是有更好的方法。请帮我解决一下这个。谢谢你。

【问题讨论】:

  • 请输入数据和预期结果
  • 返回什么:Select count(*) from Blog b inner join BlogCategories bc on b.Id = bc.BlogId where b.StatusId = 2 and bc.CategoryId = 2 and b.IsDeleted = 0
  • @AntonínLejsek 在我的数据库中返回计数 7

标签: c# mysql sql asp.net pagination


【解决方案1】:

只有7行满足这个条件

b.StatusId = 2 and bc.CategoryId = 2 and b.IsDeleted = 0

如果您想跳过 73 行结果并仍然获得一些行,则必须向数据库添加更多数据。

【讨论】:

  • 我的表格共有 77 行。够了吗??
  • 你有两张桌子。除此之外,还取决于它们的 statusId、CategoryId 和 IsDeleted 状态。您可以拥有数百万行,如果它们不满足您的过滤条件,您将永远不会在结果中看到它们。
  • 有什么方法可以获取我的分页记录吗??
  • 是的,我看不出你哪里有问题。但是如果数据库中只有一页数据,就不能指望得到十页的结果。
  • 还有一件事,这个查询不返回获取的记录数,这是计算总页数所必需的。是否有可能在一个数据库调用中得到它??
【解决方案2】:

OFFSET 用于省略特定数量的行,而 FETCH NEXT 用于获取在偏移之后的一定数量的行,此处 order by 保留行的顺序,以便您准确获得预期的结果得到,所以如果您的查询没有给出输出,那么这意味着您在偏移 73 行后没有要获取的行,在您的情况下,查询只给出 7 行,因此您没有得到输出。

【讨论】:

  • 好的,明白了。有没有其他方法可以获得我想要的结果??
  • 如果你想要这些数据,那么你可以删除偏移量并获取下一个,否则偏移 0 行
  • 我添加了偏移量,因为我想对我的记录进行分页。每页9个。我想如果我删除偏移量并获取它,它对分页不起作用。
  • 了解然后偏移 0 行并仅在这种特殊情况下获取下 9 行,否则无论如何如果您需要偏移 73 行数为 7,您需要更多数据以便您可以偏移和获取
猜你喜欢
  • 2012-05-30
  • 1970-01-01
  • 2014-07-12
  • 2012-03-14
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 2013-02-09
相关资源
最近更新 更多