2016-09-06 6 views
0

Я хочу сделать разбиение на страницы для api/ajax, , если использование страницы 1, страница 2 типа .. может быть повторяющейся строкой, если новая строка просто создана.найти индекс/базу смещения по определенному идентификатору

Так что я вижу, как Instagram API делает и попытался ниже,

первый запрос:
использование запроса 1
читать первый ряд смещения параметр равен нулю, и возвращать pagination данные для Ajax, чтобы запросить следующую

"pagination": { 
    "prev_end_id": .., 
    "count": ... 
} 

запрос следующий:
использование запроса 2
Если заказ id или price_number is integer, я вернусь prev_end_id или prev_end_price, check desc или asc, затем выберите размер или мень.
Но если заказ на namestring или другой тип колонки, как это сделать?

Я делаю правильно, есть ли лучший способ решить это?

Должен ли я игнорировать порядок, в котором колонки, просто вернуть end_id,
когда запрос дальше,
найти смещение базы по идентификатору, а затем сделать то же самое, как первый запрос?
так, как найти смещение базы на id?
Выбрать все строки и строки цикла, чтобы найти определенный индекс id? звуки низкой производительности ...

1 
SELECT 
    p.* 
    FROM product p 
    ORDER BY p.id desc NULLS LAST OFFSET $1 LIMIT $2 
2 
SELECT 
    p.* 
    FROM product p 
    WHERE p.id < $1 
    ORDER BY p.id desc NULLS LAST LIMIT $2 

1 
SELECT 
    p.* 
    FROM product p 
    ORDER BY p.name desc NULLS LAST OFFSET $1 LIMIT $2 
2 
SELECT 
    p.* 
    FROM product p 
    AND p.price_number < $1 
    ORDER BY p.name desc NULLS LAST LIMIT $2 


CREATE TABLE IF NOT EXISTS "product"(
    "id" SERIAL NOT NULL, 
    "name" varchar DEFAULT NULL, 
    "name_slug" varchar DEFAULT NULL, 
    "price_number" numeric DEFAULT NULL, 
    PRIMARY KEY ("id") 
); 

ответ

1

Вы должны использовать набор ключей пагинации, потому что OFFSET проблема производительности и может привести к странным результатам, если новые данные добавляются одновременно (как вы заметили).

Если sort_key это поле, по которому ранжируются результаты, то первый запрос будет выглядеть следующим образом:

SELECT * FROM product 
ORDER BY sort_key 
LIMIT 50; 

Тогда вы помните, самый большой вернулся sort_key, независимо от того, если это целое число или строка, как и <last_key>.
Ваш второй запрос выглядит следующим образом:

SELECT * FROM product 
WHERE sort_key > <last_key> 
ORDER BY sort_key 
LIMIT 50; 

и так далее, пока вы не закончите.

Для повышения эффективности создайте индекс на sort_key.

Вы можете найти этот метод, описанный here.

+0

Спасибо за ответ, это похоже на мой пример? моя проблема в том, что тип данных столбца - строка не целочисленная, а затем, как заставить ее стать sort_key user1775888

+1

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

+0

Большое вам спасибо, я попробую! – user1775888

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