2015-07-21 1 views
3

Я создаю оператор mysql, который разбивает результаты на страницы с помощью LIMIT x, n (где x - это смещение и n возвращенных записей).mysql select statement with limit offset больше фактических записей

Смещение создается с использованием GET-Vars в форме page=x.

Теперь у Google есть некоторые странные записи в своем индексе, которые исходят из старых обходов, где переменная страницы превышает фактическое количество записей в результирующем наборе.

Значит, запрос создается с переменной страницы на что-то вроде LIMIT 1000, 30 -.. Но запрос будет возвращать только 900 записи (так как содержание таблицы изменилось между тем Это возвращает пустой результат-набор, конечно

Есть ли способ сказать mysql, что если смещение превышает возвращаемые записи, чтобы просто показать последний возможный результат? Я не хочу делать дополнительный запрос, используя сначала COUNT(), так как это удвоит нагрузку на mysql-server (сейчас я использую SQL_CALC_FOUND_ROWS, чтобы определить общее количество записей, которые запрос вернет без LIMIT -Statement.

+0

Таким образом, вы полагаетесь на несвежих ссылки? – Drew

+0

Есть ли способ избежать использования MySQL для обеспечения этого? Не могли бы вы включить это в свою бизнес-логику? –

+0

Пожалуйста, покажите нам столбцы в этой таблице. –

ответ

2

Получить все требуемые строки, по крайней мере, один ряд (MySQL 5.6):

SELECT * 
FROM `table` 
LIMIT 1000, 30 
UNION ALL (
    SELECT * 
    FROM `table` 
    WHERE FOUND_ROWS() = 0 
    ORDER BY `id` DESC 
    LIMIT 1 
) 

SQL Fiddle

+0

Я пробовал этот запрос, когда первый SELECT содержит записи, которые вписываются в предельное смещение, тогда возвращается только 1 строка. Когда предельное смещение не дает никаких результатов, UNION будет возвращать 1 строку для каждого нечетного вызова и 0 для каждого четного вызова (он чередуется между 0/1 строками при обновлении). –

+0

Хм, это действительно странно. Я сам испытал это и получил такое же странное поведение. Кажется, он работает с «LIMIT 1000», но не с «LIMIT 0, 1000», который, очевидно, тот же. Такой смысл не имеет смысла и кажется для меня ошибкой. Я буду исследовать это, спасибо за намек. –

+0

Да, к сожалению, это не работает. Я попробовал, потому что это казалось крутым решением. Если вы получите его на работу или узнаете, что произойдет, было бы здорово узнать. –

 Смежные вопросы

  • Нет связанных вопросов^_^