#php #jquery #sql #sql-server #datatables
#php #jquery #sql #sql-сервер #таблицы данных
Вопрос:
Я пытаюсь настроить разбивку на страницы с таблицами данных, используя PHP PDO с MS SQL, поскольку «limit» неприменим, мне действительно сложно заставить код работать.
Я пробовал синтаксис «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)
Ответ №1:
Ваш подход зависит от версии 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);
}
?>
Комментарии:
1. Привет! спасибо вам за это. к сожалению, все еще не работает. Я использую коды, предоставленные вами для SQL server 2008, поскольку я использую именно эту версию. я опубликую снимок экрана, чтобы было понятно.
2. привет!, в нем отсутствует слово «sub». ———————————————————-
sub WHERE Rn BETWEEN ". $_POST["start"] ." AND ". $_POST["start"] $_POST["length"] - 1)
. its не показывает никаких ошибок, но разбивка на страницы по-прежнему не работает.3. боже мой! теперь он работает отлично. я забыл убрать некоторые скобки, которые я добавил в тестовые коды. я только что добавил слово sub. это идеально. спасибо большое!
4. добавление запроса для обеспечения работы разбивки на страницы, похоже, отключает функции поиска. я не могу выполнить поиск сейчас, он просто возвращается к первым 10 строкам.
Ответ №2:
Для MSSQL
использования ограничения вам нужно будет написать свой запрос следующим образом:
ORDER BY X.Field
OFFSET 20 ROWS
FETCH NEXT 10 ROW ONLY OPTION (RECOMPILE)
При этом будут пропущены первые 20 записей и будут извлечены следующие 10.
Комментарии:
1. привет! Спасибо. я пробовал это в MS SQL 2017, и это работает, но в настоящее время я работаю над версией 2008.