当我从数据库表中获取特定记录时,我想要获取“上一个”和“下一个”记录。比如我有一个照片表:从数据库中获取下一个和前一个记录
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. 感谢您的帮助。
当我从数据库表中获取特定记录时,我想要获取“上一个”和“下一个”记录。比如我有一个照片表:从数据库中获取下一个和前一个记录
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. 感谢您的帮助。
如果你在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`)
你可以得到以前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)
不要忘记订购; MySQL表格没有固有的顺序,尽管粗略的一瞥可能意味着什么。 – 2011-04-24 12:21:04
@Tomalak:哎呀,好点。我通过订购更新了答案。 – WhiteFang34 2011-04-24 12:24:56
+1;去偷它。 – 2011-04-24 12:25:59
这里是只是一个查询所需的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查询更好的方法或使用3个查询(1为特定照片,2其他查询为上一个和下一个)。 – sid 2011-04-24 12:34:24
@sid,我认为这可能是一些选择的问题,但对我来说,如果我必须在db上执行3个查询只是获取这些数据(db I/O通常是一个昂贵的操作),那么如果一个查询可以一次给我所有的数据,对我来说这会更好/更便宜。但也许这取决于。 – nemesisfixx 2011-04-24 12:37:11
谢谢关于索引,因为我想从照片数据库中获取更多列,例如photo_name,photo_path等,索引是否会像上面提到的那样? – sid 2011-04-24 12:47:39
@sid:现在我想到了“单独问题”领域。 – 2011-04-24 12:49:48