romash
@romash
web-разработчик

Как получить данные SQL запросом, начианя с конкретное строки?

Есть таблица со следующими полями
  • id — строка случайных символов, первичный ключ
  • date - дата с точностью до дня, неуникальна
  • ...


Из неё данные извлекаются порциями с сортировкой по дате:
SELECT * FROM `table` ORDER BY `date` DESC LIMIT 4
После обработки первого запроса сохраняется id последней полученной строки.
Вопрос: как при следующем запросе указать, что начать нужно со строки с конкретным id?

В голову приходит только запоминать количество извлечённых строк и после этого делать LIMIT $gotten, 4, но это сломается, если за время между запросами появятся новые записи с более поздней датой.
  • Вопрос задан
  • 677 просмотров
Пригласить эксперта
Ответы на вопрос 4
@ZhukovAN
Отказаться от подхода "черт-те-как спроектируем БД, а потом будем задалбывать ее сложными SQL-запросами, жрущими непомерные ресурсы на тривиальных задачах". Если id, действительно, "строка случайных символов", то полезной информации в ней ноль. В этом случае сделать рефакторинг и заменить id на автоинкрементное целочисленное поле с индексом и делать выборку простейшимWHERE id > :thePreviousMaxId. Если в id все-таки имеется осмысленная информация, используемая не только для обеспечения уникальности - добавить автоинкрементный альтернативный ключ, сведя тем самым решение к предыдущему варианту. В любом случае это будет эффективнее, чем заниматься запоминанием ранее полученных id
Ответ написан
Можно брать с «нахлёстом». Раз день неуникален – коллизии возможны в рамках этого дня.

Придётся запоминать все id последнего дня выборки.

При следующем шаге надо включить последний день целиком, и исключить из него строки с запомненными id.
Ответ написан
@Arik
Если нужно сохранить состояние, то или промежуточная/временная таблица или, если записей не так много, запросить id'шки Всех записей и потом спрашивать уже по id через IN(). Как вариант еще можно update'ом метки поставить всем записям и когда будет обход, то новые записи не будут иметь эту метку, а значит не будут учавствовать в выборке с лимитом, но это для одного клиента, если демоном надо обойти все записи.
Ответ написан
Комментировать
@vyrkmod
Пишу на php. И не стыдно.
LIMIT $gotten, 4
- как раз вариант. Если нужно чтобы выборка не сдвигалась при добавлении новых полей - запоминаем наибольшее значение date при первом запросе, в последующие добавляем "`date` <= $maxdate". в WHERE.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы