我正在尝试使用带有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)的查询的屏幕截图
答案 0 :(得分:0)
在MSSQL
中使用限制,您将需要这样编写查询:
ORDER BY X.Field
OFFSET 20 ROWS
FETCH NEXT 10 ROW ONLY OPTION (RECOMPILE)
这将跳过前20条记录,并获取下10条记录。
答案 1 :(得分:0)
您的方法取决于SQL Server版本。
基于ORDER BY
子句且OFFSET
和FETCH
作为paging solution的方法需要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);
}
?>