Мне нужно выполнить запрос SELECT для базы данных PostgreSQL, используя оконную функцию OVER()
.
Позволяет получить либо диапазон выбранных строк, указанных в значениях OFFSET
и LIMIT
, либо количество общих строк, которые запрос получит без ограничения:
SELECT
DISTINCT *, COUNT(id) OVER() AS results_num
FROM (
SELECT id, name, surname
FROM users
WHERE children > 1
ORDER BY id
) AS x
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;
Чтобы разработать метод подкачки, мне нужно динамически установить смещение и limit , поэтому, используя PDO, я определяю заполнители параметров строки запроса для переменных OFFSET
и LIMIT
которые затем связаны через bindParam()
:
$sql = "SELECT DISTINCT *, COUNT(id) OVER() AS results_num FROM (
SELECT id, name, surname
FROM users
WHERE children > 1
ORDER BY id
) AS x
OFFSET :offset ROWS FETCH NEXT :limit ROWS ONLY;"
$query = $dbh->prepare($sql);
$query->bindParam(':offset', $offset, \PDO::PARAM_INT);
$query->bindParam(':limit', $limit, \PDO::PARAM_INT);
$result = $query->execute();
Ошибка:
ERROR: syntax error at or near "$2"
LINE 7: ) AS x OFFSET $1 ROWS FETCH NEXT $2 ROWS ONLY;
^
Код ошибки SQL - 42601 (errorInfo
возвращает SQLSTATE[42601]: Syntax error: 7
), но, похоже, он очень общий, в этом коде я обнаружил множество различных синтаксических ошибок.
Это не связано с именованными заполнителями; В действительности то же самое происходит с использованием заполнителей вопросительного знака:
$sql = "SELECT DISTINCT *, COUNT(id) OVER() AS results_num FROM (
SELECT id, name, surname
FROM users
WHERE children > 1
ORDER BY id
) AS x
OFFSET ? ROWS FETCH NEXT ? ROWS ONLY;"
$query = $dbh->prepare($sql);
$result = $query->execute([$offset, $limit]);
Я знаю, что PDO также пытается проверить структуру запроса, поэтому нельзя ли связывать этот тип синтаксиса с PDO?
EDIT:
Сам запрос правильно сформирован и работает; до сих пор я использую динамическую композицию строки запроса для установки смещения и limit , очевидно, после правильной проверки их значения:
$sql = "SELECT DISTINCT *, COUNT(id) OVER() AS results_num FROM (
SELECT id, name, surname
FROM users
WHERE children > 1
ORDER BY id
) AS x
OFFSET " . $offset . " ROWS FETCH NEXT " . $limit . " ROWS ONLY;"