当我从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。 谢谢你的帮助。
答案 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
中。
希望这有帮助,测试并告诉我......