【问题标题】:Server-side processing Datatables pagination Microsoft SQL服务器端处理 Datatables 分页 Microsoft SQL
【发布时间】:2023-10-18 14:32:01
【问题描述】:

我正在尝试使用带有 MS SQL 的 PHP PDO 设置数据表的分页,因为“限制”不适用,我发现很难让代码工作。

我尝试过“TOP”语法,但它只会过滤指定的数字,分页不起作用。

我已经尝试过偏移和获取仍然无法正常工作。

这些是使用Mysql时的工作代码,它很容易理解和执行。

if($_POST["length"] != -1)
   {
$query .= 'LIMIT ' . $_POST['start'] . ', ' . $_POST['length'];
   }

这些是我尝试过的代码(对不起,我的编码不是很好):

//if($_POST["length"] != -1)
   {
Trial 1 : //$query .= "TOP " . $_POST['start'] . " OFFSET " .                     $_POST['length'];


Trial 2 : //$query .= "SELECT * from item ORDER BY id DESC offset 0 rows fetch next 10 rows only ";


    Trial 3 ://$query .="AND id BETWEEN ".intval( $_POST["start"] )." AND ".intval( $_POST["length"] );" "

}

结果应该是一个分页,每条记录有 10 条过滤记录。enter image description here

更新 1:

这是我尝试在 MS SQL 服务器中测试但出现错误的查询屏幕截图(使用 MS SQL 2008)

SQL Query

【问题讨论】:

    标签: php jquery sql sql-server datatables


    【解决方案1】:

    您的方法取决于 SQL Server 版本。

    方法,基于 OFFSETFETCH 作为 paging solutionORDER BY 子句,需要 SQL Server 2012+。您的语法似乎正确,因此下一个代码应该可以工作:

    <?php
    if ($_POST["length"] != -1) {
        $query = "
            SELECT * 
            FROM item 
            ORDER BY id DESC OFFSET ".($_POST['start']-1)." ROWS FETCH NEXT ".$_POST["length"]." ROWS ONLY
        ";
    }
    ?>
    

    对于 SQL Server 2008+,您可以使用 ROW_NUMBER() 作为分页解决方案:

    <?php
    if ($_POST["length"] != -1) {
        $query = 
            "SELECT *
            FROM (
                SELECT 
                    *, 
                    ROW_NUMBER() OVER (ORDER BY id DESC) AS Rn
                FROM item
            )
            WHERE Rn BETWEEN ".$_POST['start']." AND ".($_POST['start'] + $_POST['length'] - 1);        
    }
    ?>
    

    【讨论】:

    • 嗨!这次真是万分感谢。不幸的是仍然无法正常工作。我使用您为 SQL Server 2008 提供的代码,因为那是我正在使用的版本。为了清楚起见,我会发布一个屏幕截图。
    • 嗨!,它缺少“sub”这个词。 -------------------------------------------------- -------- sub WHERE Rn BETWEEN ". $_POST["start"] ." AND ". $_POST["start"] + $_POST["length"] - 1) 。它没有显示任何错误,但分页仍然无法正常工作。
    • 天哪!它现在工作得很好。我忘了删除我添加到测试代码中的一些括号。我刚刚添加了 sub 一词。这是完美的。气死你了!
    • 添加查询以使分页工作似乎禁用了搜索功能。我现在无法搜索它只是回到前 10 行。
    【解决方案2】:

    MSSQL 中使用限制,您需要像这样编写查询:

    ORDER BY X.Field
    OFFSET 20 ROWS 
    FETCH NEXT 10 ROW ONLY OPTION (RECOMPILE)
    

    这将跳过前 20 条记录并获取接下来的 10 条记录。

    【讨论】:

    • 嗨!谢谢你。我在 MS SQL 2017 和它的工作中试过这个,但我目前正在为 2008 版本工作。