Извлечение следующей и предыдущей записи из базы данных - PullRequest
1 голос
/ 24 апреля 2011

Когда я выбираю конкретную запись из таблицы БД, я хочу получить также «предыдущую» и «следующую» записи.Например, у меня есть таблица фотографий:

photo_id    user_id     photo_name      
1             1         xx
2             2          --
3             1          --
4             1          --

Теперь, например, я хочу получить фотографии user_id 1. Например, если photo_id равен 1, предыдущей фотографии не будет, если photo_id равно 3,предыдущая запись будет photo_id 1, а следующая будет 4. Спасибо за любую помощь.

Ответы [ 3 ]

1 голос
/ 24 апреля 2011

Если вы используете photo_id == 3 и знаете, что оно принадлежит user_id == 1, тогда:

«предыдущий» photo_id для этого пользователя:

SELECT `photo_id`
  FROM `photos`
 WHERE `photo_id` < 3 AND `user_id` = 1
 ORDER BY `photo_id` DESC
 LIMIT 1

и «следующий» photo_id для этого пользователя:

SELECT `photo_id`
  FROM `photos`
 WHERE `photo_id` > 3 AND `user_id` = 1
 ORDER BY `photo_id` ASC
 LIMIT 1

Для получения бонусного балла вы можете сделать это более эффективным с помощью индекса:

CREATE INDEX `idx_user_photo`
    ON `photos`
       (`user_id`, `photo_id`)
1 голос
/ 24 апреля 2011

Вот требуемый SQL в только один запрос - позволяет выбрать все 3 фотографии, которые вы хотите сразу (если они существуют):

SELECT p.`photo_id` AS photo, 
(SELECT o.`photo_id` FROM photos o WHERE o.`user_id` = p.`user_id` AND o.`photo_id` < p.`photo_id` LIMIT 1) AS previous_photo, 
(SELECT o.`photo_id` FROM photos o WHERE o.`user_id` = p.`user_id` AND o.`photo_id` > p.`photo_id` LIMIT 1) AS next_photo 
FROM photos p 
WHERE p.`user_id` = 1 AND p.`photo_id` = 3 LIMIT 1;

Это позволиттекущее фото (photo_id = 3) в photo, поместите предыдущее в previous_photo, а следующее в next_photo.

Надеюсь, это поможет, протестируйте его и скажите мне ...

1 голос
/ 24 апреля 2011

Вы можете получить предыдущий photo_id следующим образом:

SELECT photo_id FROM photos
WHERE user_id = ? AND photo_id < ?
ORDER BY photo_id DESC LIMIT 1

А следующее так:

SELECT photo_id FROM photos
WHERE user_id = ? AND photo_id > ?
ORDER BY photo_id ASC LIMIT 1

Убедитесь, что у вас есть составной индекс (user_id, photo_id) для лучшей производительности. E.g.:

CREATE INDEX idx_user_photo ON photos (user_id, photo_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...