2011-04-24 110 views
1

当我从数据库表中获取特定记录时,我想要获取“上一个”和“下一个”记录。比如我有一个照片表:从数据库中获取下一个和前一个记录

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. 感谢您的帮助。

回答

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`) 
+0

谢谢关于索引,因为我想从照片数据库中获取更多列,例如photo_name,photo_path等,索引是否会像上面提到的那样? – sid 2011-04-24 12:47:39

+0

@sid:现在我想到了“单独问题”领域。 – 2011-04-24 12:49:48

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)综合指数有更好的表现。例如:

CREATE INDEX idx_user_photo ON photos (user_id, photo_id) 
+1

不要忘记订购; MySQL表格没有固有的顺序,尽管粗略的一瞥可能意味着什么。 – 2011-04-24 12:21:04

+0

@Tomalak:哎呀,好点。我通过订购更新了答案。 – WhiteFang34 2011-04-24 12:24:56

+0

+1;去偷它。 – 2011-04-24 12:25:59

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

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

+0

谢谢。我只是好奇地知道,如果使用1查询更好的方法或使用3个​​查询(1为特定照片,2其他查询为上一个和下一个)。 – sid 2011-04-24 12:34:24

+0

@sid,我认为这可能是一些选择的问题,但对我来说,如果我必须在db上执行3个查询只是获取这些数据(db I/O通常是一个昂贵的操作),那么如果一个查询可以一次给我所有的数据,对我来说这会更好/更便宜。但也许这取决于。 – nemesisfixx 2011-04-24 12:37:11

相关问题