【问题标题】:Paginate rows from SQL从 SQL 中对行进行分页
【发布时间】:2011-01-23 23:04:29
【问题描述】:

我正在尝试完成我的新闻/博客 ASP.net C# 应用程序的编写,但在基于标签或关键字过滤项目后,我一直不知道如何一次只返回 10 个项目。 这是我正在寻找的一个例子:

  1. 用户通过浏览到 ?tag=Pizza 查询 sql
  2. 后端查找与查询字符串相等的所有标签(作为@参数发送)。这部分我已经想通了。
  3. 现在我希望它一次只从这个过滤语句返回 10 行。当我没有过滤掉任何东西时,我很容易做到这一点:

    sqlCommand.CommandText = "SELECT * FROM (SELECT row_number() over(ORDER BY news_id) AS row_number, * FROM news) T WHERE row_number BETWEEN (SELECT rowcnt FROM sys.sysindexes WHERE (id = OBJECT_ID('news')) AND (indid < 2))-(@start+10) AND (SELECT rowcnt FROM sys.sysindexes  WHERE (id = OBJECT_ID('news')) AND (indid < 2))-(@start) ORDER BY news_id DESC";
    
    sqlCommand.Parameters.Add("@start", SqlDbType.Int).Value = start;
    
  4. 然后我会在页面底部显示用户查看更多内容的选项。 (这部分很简单,我只需要将 10 添加到 ?num= 的查询字符串中)。

实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: c# asp.net sql-server


    【解决方案1】:

    【讨论】:

    • 所有这些都是我已经在做的。他们只计算整个表格的行数。我需要能够从第 100 行到第 88 行到第 12 行到第 1 行或类似的东西。
    • 嗯,不,他们没有。所有其他问题都完全按照您的要求进行。如果您的问题与这些不同,那么您将不得不更具体地了解它如何不同。
    • 我需要“SELECT * FROM news WHERE news_cat = 'Pizza' 然后对其进行分页。所有这些示例只是在没有 where 的情况下分页。如果我将它添加到当前的 SQL 语句中,我最终会得到一些结果。
    • 我明白了。第 4 条和第 5 条链接都解决了这个问题。现在估计无所谓了。很高兴你解决了!
    【解决方案2】:

    一开始,了解 row_number 如何对结果进行编号有点棘手。

    看起来有两件事让这件事变得比想象的更复杂。 row_number 函数必须在 相同的 SELECT 或外部 SELECT 中,而不是进行过滤,否则您是在对整个表进行编号,而不是对结果进行编号。您的查询对表中的所有结果进行了编号在行受到限制之前,因为 row_number 用于 带有 WHERE 的 SELECT 中的 SELECT。

    其次,当您只需将 DESC 添加到 row_number 函数时,看起来您正在点击 sys.indexes 以将行数(我不确定它是否总是准确)反向获取到行号范围。

    SELECT
        *
    FROM
        (
            SELECT
                row_number() over(ORDER BY news_id DESC) AS row_number,
                *
            FROM
                news
            WHERE
                --user filter goes here
                news_cat = 'Pizza'
        ) AS T
    WHERE
        row_number BETWEEN @start AND @start + 10
    

    【讨论】:

    • Aaronaught 提供了有用的链接,但还不明白您无法正确编号结果。
    • 这会影响查询性能吗?是否建议这样做?
    【解决方案3】:

    我在 2-3 年前在 codeproject 上写了这篇文章,当时框架中的分页支持仍然相当有限,也许仍然是一个很好的参考。

    如果您只关心数据,请查看我如何检索分页数据的部分。

    http://www.codeproject.com/KB/aspnet/GridViewNeatPaging.aspx

    【讨论】:

      猜你喜欢
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 2011-03-27
      • 2019-12-23
      • 1970-01-01
      • 2019-11-08
      相关资源
      最近更新 更多