Как лучше всего получить 3 предыдущих изображения и 3 более поздних записи изображения в запросе MySQL?

0

Я кратко объясню, что я хочу сделать с функциональной точки зрения. Я работаю над галереей изображений. На странице, которая показывает одно изображение, я хочу, чтобы на боковой панели отображались эскизы изображений, загруженных одним и тем же пользователем. Максимум должен быть 6, 3, которые были размещены перед текущим основным изображением, и 3, которые были размещены после основного изображения. Вы можете видеть это как поток изображений того же пользователя, через который вы можете перемещаться. Я считаю, что у Flickr есть аналогичная вещь.

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

Что бы вы посоветовали о том, как реализовать такой запрос? Могу ли я объединить это в одном запросе? Есть ли полезные утилиты MySQL, которые могут иметь дело с смещениями и т.д.

PS: Я предпочитаю не создавать дополнительный столбец "rank", поскольку это затрудняет управление удалением. Кроме того, использование идентификатора автоинкремента представляется рискованным, я могу изменить его для GUID позже. Наконец, я, конечно, ищу запрос, который выполняет и масштабирует.

Я знаю, что я много прошу, но это кажется проще, чем это?

Теги:

1 ответ

0
Лучший ответ

Запрос может выглядеть следующим образом. С индексом UserID + image_id (и, возможно, дополнительными полями для целей покрытия) это должно выполняться относительно хорошо.

SELECT field1, field2, whatever
FROM myTable
WHERE UserID = some_id
  -- AND image_id > id_of_the_previously_first_image
ORDER BY image_id
LIMIT 7;

Чтобы помочь с масштабированием, вы должны использовать более высокое значение LIMIT и кеш соответственно.

Изменить (ответные замечания/вопросы):
Комбинированный индекс...
состоит из нескольких полей, в частности,

CREATE [UNIQUE] INDEX UserId_Image_id_idx
  ON myTable (UserId, image_ida [, field1 ...] )

Обратите внимание, что необязательные элементы этого запроса заключены в скобки ([]). Я бы предположил, что ограничение UNIQUE было бы хорошо. Дополнительные "покрывающие" поля (field1,...) могут быть бенефициарами, но будут зависеть от "ширины" таких дополнительных полей, а также от общих настроек и шаблонов использования (поскольку [большие] индексы замедляют INSERT/UPDATE/DELETE, вы можете ограничить количество и размер таких индексов и т.д.)

Такой индексный тип данных "тип" не является ни числовым, ни строковым и т.д. Он просто состоит из отдельных типов данных. Например, если UserId является VARCHAR (10), а Image_id - INT, результирующий индекс будет использовать эти два типа для базовых критериев поиска, то есть

... WHERE UserId = 'JohnDoe' AND image_id > 12389

Другими словами, не нужно сочетать эти критерии с одним ключом.

На image_id
когда вы говорите image_id, вы имеете в виду комбинированный идентификатор пользователя/изображения, верно?
Нет, я имею в виду только image_id. Я предполагаю, что это поле является отдельным полем в таблице. В другом предикате предложения WHERE учитывается UserID. Первоначальная запись вопроса указывает, что это поле автогенерируется, и я предполагаю, что мы можем полагаться на это поле для сортировки. В качестве альтернативы мы могли бы полагаться на другие поля, такие как отметка времени при загрузке изображения и т.д.

Также, запоздалая мысль, упорядоченная с помощью [монотонно возрастающего] Image_id или Timestamp_of_upload, мы можем захотеть использовать DESC-порядок, чтобы сначала показать последний "материал".

  • 0
    Звучит интересно. Просто для пояснения, как будет выглядеть это комбинированное индексное поле? Это числовое значение? Это связанная строка? Я спрашиваю об этом, потому что мне интересно, как MySQL будет искать в диапазоне, когда нет числового упорядочения. Второй вопрос: в примере запроса, когда вы говорите image_id, вы имеете в виду объединенный идентификатор пользователя / изображения, верно?
  • 0
    @ Ферди, проверь мои правки, отвечая на эти вопросы. (Извините за поздний ответ)
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню