从数据库中获取下一个和上一个记录

时间:2011-04-24 12:16:18

标签: mysql database

当我从db表中获取特定记录时,我也想获取“previous”和“next”记录。例如,我有一张照片表:

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 个答案:

答案 0 :(得分:1)

你可以像这样获得之前的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)

答案 1 :(得分:1)

如果您在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`)

答案 2 :(得分:1)

以下是一个查询中所需的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中。

希望这有帮助,测试并告诉我......