【问题标题】:Best approach to telling if there are more results than requested (paging)?判断结果是否多于请求(分页)的最佳方法?
【发布时间】:2012-06-27 18:14:12
【问题描述】:

我正在运行一个检索 20 行的查询(例如)。我想知道是否有 21 个,以便我可以相应地启用“下一页”按钮。目前,我正在检索 pageSize + 1 并返回一个布尔值作为 out 参数,根据是否检索到 21 个(在这种情况下)行来为其分配值,但实际上只会将 20 个作为列表返回。这意味着我正在检索一个额外的查询,然后我会忽略这对于性能来说并不理想,并且我不想运行 count(*),因为它完全是另一个查询。

注意:使用分页数据源并不是一个真正的选择,必须坚持使用 rowlimit 并开始行。

感谢您的任何建议。

【问题讨论】:

    标签: c# sql pagination


    【解决方案1】:

    您可以使用嵌套查询,如下所示:

     select    TOP 20 *,
               (select count(*) from tableName) as TotalCount
     from      tableName
    

    然后每一行都会有总列,所以你可以检查一下。

    或者,您可以使用这种语法,避免嵌套选择。当您有额外的谓词(不必在嵌套选择中重复)时,这将变得更加方便:

     select    TOP 20 *, count(*) over() as TotalCount
     from      tableName
    

    【讨论】:

    • 完美!正是我所追求的。非常感谢朋友,不知道为什么我没有想到这一点。
    【解决方案2】:

    这是使用 row_number 的一个

    –-Change these two variable to parameters of your
    –-actual stored procedure
    
    Declare @PageNumber int
    Declare @PageSize int
    
    
    –-Assume we need page 6 i.e. records from 51-60
    Select @PageNumber=6
    Select @PageSize=10
    
    
    –-Select only those records which
    –-fit into a single page
    Select Top(@PageSize) * from
    (
    Select
    RowID=ROW_NUMBER() OVER (ORDER BY Name),
    ProductID,Name,ProductNumber,ListPrice,
    TotalRows=Count(*) OVER() --Count all records
    from Production.Product
    ) A
    Where A.RowId > ((@PageNumber-1)*@PageSize)
    

    【讨论】:

      【解决方案3】:
      1. 获取一次计数(*)。用它来显示页数。
      2. 用户每点击一次页码,获取20条记录

      【讨论】:

      • 这也很有意义。非常感谢。我认为让这个页面尽可能保持最新对我来说很重要,因为我正在搜索的页面数量是非常动态的。无论如何 +1。
      • 那么你似乎有更好的approrach pageSize+1
      【解决方案4】:

      试试这个

      Select *,Row_Number .... as RowNo
      into #Table
      from Table
      
      Select * 
      from #Table
      WHERE RowNo > @FirstRec AND RowNo < @LastRec
      
      Select count(*)
      from #Table
      

      【讨论】:

      • 我应该提到它不是存储过程,抱歉,只是一个 SQL 命令。
      • 在这种情况下,您只执行一个查询。
      【解决方案5】:

      我怀疑在同一个数据库访问中检索一个额外的行(21 对 20)在性能方面几乎可以忽略不计。

      【讨论】:

      • 查询很复杂,而且看起来可以忽略不计 - 寻找更好的替代方案并没有什么坏处。谢谢。
      【解决方案6】:

      2 个查询:

      1. 结果页面
      2. 然后是结果总数

      第一个查询将包含页面和页面大小,第二个查询将为您提供总行数。使用此信息,您可以计算总页数并将其呈现给用户。

      【讨论】:

      • 谢谢伙计,感谢您的回复 - 但就像我说的那样,我想避免使用另一个查询来计算结果。这是解决它的唯一方法吗? +1。
      • 这是常用的方法。并且 1 个额外的标量查询不会有问题。除了 2 个查询!= 2 sqlcommands。您可以在 sql 命令中定义 2 个查询并在结果集中移动。或者,如果您使用像 NH 这样的 ORM,您可以使用 futures 通过 1 个远程调用发出多个查询。
      猜你喜欢
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 2023-03-09
      • 2017-12-12
      • 2011-02-21
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      相关资源
      最近更新 更多