«Центрирование» результата mysql

#php #mysql #sql #database

#php #mysql #sql #База данных

Вопрос:

Я пытаюсь создать галерею фотографий на php mysql.

URL viewphoto.php?id=143 показывает фотографию 143. В меню навигации я хочу отобразить две предыдущие фотографии в этом альбоме и следующие две.

Я думал об использовании:

 $temp_id = $id - 2;
mysql_query("SELECT id, photo FROM photos WHERE album = {$album} AND id >= {$temp_id} LIMIT 5");
  

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

Кто-нибудь знает, как я мог бы это сделать?

Спасибо.

Комментарии:

1. сначала вы должны определить «предыдущий» и «следующий». В терминах, понятных вашей базе данных.

Ответ №1:

Использование идентификатора для сортировки ваших изображений — плохая идея. Представьте, что вы удаляете одну картинку. Ваша цепочка изображений будет разорвана. Чтобы это исправить, вам нужно было бы изменить столбец id, что является еще худшей идеей.

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

Или вы определяете «предыдущий» и «следующий» столбцы в вашей таблице. Тогда это будет содержать идентификатор последнего и следующего изображения. Если изображение удаляется, вам нужно только изменить эти столбцы для предыдущего и следующего изображения.

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

Комментарии:

1. Спасибо! Я создаю дополнительный столбец сортировки. Это сделает это.

2. @Before хотя ничего плохого в использовании id нет, если его порядок вас устраивает. Если вы удалите изображение, это ничего не нарушит. Вам нужно отдельное поле, только если вы хотите изменить порядок вручную.

Ответ №2:

Я сам сталкивался с этой проблемой, и я так и не нашел элегантного решения проблемы, я закончил тем, что сделал это в двух запросах:

 // next
mysql_query("SELECT id, photo FROM photos WHERE album = {$album} AND id > {$id} ORDER BY id ASC LIMIT 2");

// prev
mysql_query("SELECT id, photo FROM photos WHERE album = {$album} AND id <= {$id} ORDER BY id DESC LIMIT 3");
  

Теперь первым элементом в «предыдущем» после извлечения будет текущая фотография.

В это решение необходимо внести поправки, проверив, что первый элемент в «prev» на самом деле является запрошенным идентификатором, потому что он не гарантирует, что это правильный идентификатор, в случае пробелов в ряду.

Комментарии:

1. Это довольно просто. Объединение между этими двумя запросами — это именно то, что я искал. Спасибо!

2. Да, объединение дало бы хороший массив! Но разгрузит ли это сервер БД хоть сколько-нибудь?