當我從數據庫表中獲取特定記錄時,我想要獲取「上一個」和「下一個」記錄。比如我有一個照片表:從數據庫中獲取下一個和前一個記錄
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