2011-04-24 111 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

相關問題