Страницы результатов с OFFSET
Магазин с тысячами игр не показывает их все сразу. Он показывает, скажем, по двадцать на странице, с кнопками для следующих страниц. В SQL страницы делают с помощью OFFSET: он пропускает заданное число строк, прежде чем LIMIT начнёт считать:
SELECT name, city
FROM customers
ORDER BY name
LIMIT 5 OFFSET 5;| name | city |
|---|---|
| Jack Harris | Manchester |
| Leo Walker | London |
| Liam Turner | Manchester |
| Max Baker | Bristol |
| Mia Lewis | Bristol |
Это вторая страница клиентов, по пять на странице: OFFSET 5 пропускает первых пять (от Ava Green до Isla Young), а LIMIT 5 показывает следующие пять. У первой страницы OFFSET 0, что то же самое, что вообще без OFFSET, а у третьей — OFFSET 10. В общем виде страница пропускает строки всех предыдущих страниц: (номер страницы − 1) × число строк на странице.
Последняя страница может оказаться короче. В магазине 14 клиентов, поэтому на третьей странице их всего четыре. А если OFFSET пропустит все строки, результат будет пустым: останутся только названия столбцов.
Для страниц нужна сортировка, которая задаёт один точный порядок. Если бы две строки были равны, база данных могла бы показать одну из них в конце первой страницы и ещё раз в начале второй, а другую — ни на одной. Поэтому страницы сортируют по тому, что не повторяется, или добавляют последним столбцом сортировки, например, id.
SQLite понимает и более короткую запись, LIMIT 5, 5, но будьте осторожны: там сначала идёт число пропускаемых строк, так что LIMIT 10, 5 пропускает десять строк и показывает пять. Это легко перепутать, поэтому в курсе мы пишем OFFSET.
Задание
- 1
Запрос в редакторе показывает первую страницу каталога магазина: игры, отсортированные по названию, по четыре на странице. Измените его так, чтобы он показывал третью страницу:
title price Lost Temple 20 Moon Farm 20 Mystery Manor 25 Ocean Deep 15 - 2
Ниже добавьте запрос, который показывает название и цену всего одной игры — второй по дороговизне.
title price Goal Rush 50