Ответ
В SQL OFFSET — это ключевое слово, используемое в предложении LIMIT для указания количества строк, которые нужно пропустить перед началом возврата результатов из запроса. Это основа для реализации постраничной навигации (пагинации).
Синтаксис:
SELECT * FROM `products`
ORDER BY `created_at` DESC
LIMIT 10 OFFSET 20; -- Пропустить 20 строк, вернуть следующие 10
Эквивалентная запись (более распространенная):
SELECT * FROM `products`
ORDER BY `created_at` DESC
LIMIT 20, 10; -- LIMIT offset, row_count (пропустить 20, взять 10)
Практический пример пагинации на PHP/PDO:
$itemsPerPage = 10;
$page = (int) ($_GET['page'] ?? 1);
$offset = ($page - 1) * $itemsPerPage;
$stmt = $pdo->prepare("SELECT id, name, price FROM products LIMIT :limit OFFSET :offset");
$stmt->bindValue(':limit', $itemsPerPage, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$products = $stmt->fetchAll();
Важные замечания:
- Производительность: На больших
OFFSET(например, 10000) запрос может работать медленно, так как СУБД все равно должна отсчитать пропускаемые строки. Для глубокой пагинации лучше использовать ключи (WHERE id > :last_id). - Совместимость:
LIMIT X OFFSET Y— стандартный SQL, в то время какLIMIT Y, X— синтаксис MySQL. - Использование с
ORDER BY: Всегда используйтеOFFSETвместе сORDER BY, иначе порядок строк не гарантирован, и пагинация будет некорректной.