Из того, что вы говорите здесь:
Dont хотите использовать (после = 6) также потому, что его динамический сайт и изображения добавляются и удаляются, поэтому перемещение позиции и совместное использование с кем-то другим и возврат к прежней старой ссылке, тогда это будет неправильная позиция.
У меня создалось впечатление, что это вообще не проблема SQL. Проблема в том, что позиции фотки являются локальными для набора результатов поиска. Чтобы надежно управлять положением, вам нужно сделать снимок (не каламбур) какого-то рода. То есть, вам нужно каким-то образом «заморозить» набор данных во время просмотра.
Простым способом сделать это будет выполнение поиска и кэширование результата за пределами фактического текущего хранилища данных. Например, вы можете использовать «скретч-таблицы» в своей базе данных, просто сохраните их во временных файлах или в каком-либо слое кэширования памяти, если у вас есть mem для него. С помощью этой модели вы позволите пользователю просмотреть набор результатов из кеша, и вам нужно будет очистить кеш при завершении сеанса пользователя (или после некоторого таймаута вы не хотите убивать ваш сервер, потому что некоторые пользователи 't log out)
Другой способ сделать это - просто позволить себе время от времени лгать. Допустим, у вас есть страницы результатов из 10 изображений, а обычный поиск обеспечивает 50 страниц результатов. Ну, вы можете просто отправить набор результатов для фиксированного количества элементов, например, 100 фотографий (так 10 страниц) клиенту.Результатом этих результатов будет ваш снимок и ссылки на фактические изображения. Если вы храните URLS в базе данных, а не двоичные данные, эта ссылка является просто URL-адресом. Или вы можете сохранить там идентификатор базы данных. В любом случае, пользователю разрешено просматривать исходный набор результатов, и, скорее всего, они никогда не просматривают весь набор. Если это так, вы повторно выполняете запрос на стороне сервера для следующего фрагмента страниц. Если бы было добавлено много фотографий в среднем времени, которое закончилось бы на позиции 1..100, тогда пользователь увидит устаревшие данные: это цена, которую они платят за то, что у них так много времени на руках, что они могут позволить им просматривать 10 страниц из 10 фотографий.
(конечно, вы должны настроить параметры по своему вкусу, но вы получите идею, я уверен.)
Если вы не хотите, чтобы «ложь», и это очень важно, что люди могут надежно просмотрите все результаты поиска, вы можете расширить схему базы данных для поддержки моментальных снимков на этом уровне. Теперь, полагая, что есть только две операции для фотографий, а именно «добавить» и «удалить», у вас будет TIMESTAMP_ADDED и TIMESTAMP_REMOVED в вашей фото таблице. При добавлении вы делаете INSERT
в своем db и заполняете TIMESTAMP_ADDED с отметкой времени в режиме реального времени. TIMESTAMP_REMOVED
будет заполнен теоретическим максимальным значением для любого типа данных, который вы хотели бы использовать для хранения метки времени (для этого конкретного случая я, вероятно, поеду для столбца INT и просто сохранил UNIX_TIMESTAMP). При удалении вы не должныDELETE
строка из db, скорее, вы помечаете ее как удаленный путем обновления столбца TIMESTAMP_REMOVED, установив его в текущую временную метку. Теперь, когда вы должны сделать поиск, вы используете запрос типа:
SELECT *
FROM photo
WHERE timestamp_added < timestamp_of_initial_search
AND timestamp_removed > timestamp_of_initial_search
AND ...various search criteria...
ORDER BY ...something
LIMIT ...page offset and num items in page...
timestamp_of_initial_search является временной меткой выполнения начального поиска по определенному набору критериев. Вы должны сохранить это в сеансе приложения, пока пользователь просматривает определенный набор результатов поиска, чтобы вы могли использовать его в последующих запросах, необходимых для получения страниц. Первые два критерия WHERE предназначены для реализации моментального снимка. Условие timestamp_added < timestamp_of_initial_search
гарантирует, что мы можем видеть только фотографии, которые были добавлены до отметки времени выполнения поиска. Условие timestamp_removed > timestamp_of_initial_search
обеспечивает только поиск, который еще не был удален к моменту начала первоначального поиска.
Конечно, вам все равно нужно что-то сделать с фотографиями, отмеченными для удаления. Вы можете запланировать периодическое физическое удаление для всех фотографий, у которых удалена метка времени, которая меньше любого из текущих результатов поиска.
basit, проверьте мой новый ответ. Создал новый, чтобы избежать беспорядка с уже длинным первым. –