Я пытаюсь настроить разбиение на страницы с таблицами данных, используя PHP PDO с MS SQL, поскольку «ограничение» неприменимо, мне очень сложно заставить код работать.
Я попробовал синтаксис «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 отфильтрованными записями в каждой.введите описание изображения здесь
Обновление 1:
Вот скриншот запроса, который я пытался проверить на сервере MS SQL, но получил ошибку (используя MS SQL 2008)






В MSSQL, чтобы использовать лимит, вам нужно будет написать свой запрос следующим образом:
ORDER BY X.Field
OFFSET 20 ROWS
FETCH NEXT 10 ROW ONLY OPTION (RECOMPILE)
И это пропустит первые 20 записей и выберет следующие 10.
Ваш подход зависит от версии SQL Server.
Подход, основанный на предложении ORDER BY с OFFSET и FETCH в качестве пейджинговое решение, требует 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 WHERE Rn BETWEEN ". $_POST["start"] ." AND ". $_POST["start"] + $_POST["length"] - 1) . он не показывает никаких ошибок, но разбиение на страницы все еще не работает.
Боже мой! теперь он работает отлично. я забыл удалить некоторые скобки, которые я добавил в тестовые коды. я просто добавил слово sub. Идеально. танк вам так много!
добавление запроса для работы с нумерацией страниц, похоже, отключает функции поиска. я не могу искать сейчас, он просто возвращается к первым 10 строкам.
Привет! Спасибо. Я пробовал это в MS SQL 2017, и он работает, но в настоящее время я работаю над версией 2008 года.