2010-12-14 76 views
2

我需要能夠找到從非自動增量ID開始的下一個和上一個記錄。MYSQL下一個上一個記錄

從數據庫中正確的排序順序由語句使用這個命令:

下面只能列出從搜索的所有結果。 ORDER BY長度(general.blockid),general.blockid,長度(general.plotid),general.plotid

需要知道下一個和上一個記錄的頁面將URL中唯一的id/varchar保存爲簡單地?ID = 100_1A

在上面的url變量例如,

100_1A是在db作爲blockplot

100是在db作爲塊標識

1A處於datbase作爲plotid

當我在記錄100_1A上時,下一個記錄應該是100_1B。 以前的記錄到100_1a應該是99_6C

我的問題是,我如何查詢數據庫的下一個記錄,當我不知道順序,直到它被排序?

我輸入的排序順序是搜索結果頁面的工作排序。

當用戶點擊進入特定的記錄,該ID被傳遞給在細節view.php的烏爾?ID = 100_1a

從視圖頁面,我需要採取100_1A並使用相同的那種看到什麼記錄之後和在100_1A

回答

1

你可以試試這個

set @row:=0; 
select * from 
(
    select *, (@row:[email protected]+1) as row_number from your_tables 
    order by 
    length(general.blockid), general.blockid, 
    length(general.plotid), general.plotid 
) as rowset 
WHERE id='100_A'; 

上述會給你二極管100_a與位置的引用列row_number,您可以使用該列,以確定下一個/上一行,如

set @row:=0; 
select * from 
(
    select *, (@row:[email protected]+1) as row_number from your_tables 
    order by 
    length(general.blockid), general.blockid, 
    length(general.plotid), general.plotid 
) as rowset 
where 
    row_number in(first_query_row+1, first_query_row-1); 

請注意,如果表是很大的查詢代價可能非常昂貴,
,你可以考慮建立一個 視圖 彙總表來存儲ROW_NUMBER和uniqid創建彙總表的

create table ordering_table 
(
    row_number int(10) unsigned not null default 0, 
    blockid varchar(255), 
); /* no index, define yourself later */ 

set @row:=0 
insert into ordering_table 
    select @row:[email protected]+1, blockid from your_tables 
    order by ... 
+0

該表龐大的14,000條記錄。以及我現在在做的事情,我只會喜歡之前和之後的下一張唱片。我會給你一段時間的解釋,看看我能否得到它的工作。 – 2010-12-14 19:46:32

+0

當你說創建一個視圖來存儲row_number你是什麼意思? – 2010-12-14 19:47:44

+0

Wiew有一些限制,例如在select查詢中不允許變量。適當的替換將創建一個彙總表,其中包含行號+非整數ID – ajreal 2010-12-14 19:55:21

相關問題