2009-11-14 54 views
1

我正在處理一些涉及數據庫表的PHP/mysql 5 web項目,該數據庫表不使用索引的GUID字符串作爲其行標識符。所以這款產品表中的行是這樣的:如何查找數據庫中的下一個/上一個行?

GUID         Name 
936DA01F-9ABD-4d9d-80C7-02AF85C822A8 Product 1 
07c5bcdc-b3a6-482f-8556-bb04fae06538 Product 2 
b7b39700-d0e2-11de-8a39-0800200c9a66 Product 3 

新的要求是,當我的Product 2詳細信息頁面上,這個頁面應該包含一個鏈接(指向Product 1)和返回鏈接指向到Product 3

尋找Product 2很簡單:

SELECT * FROM products WHERE GUID = "07c5bcdc-b3a6-482f-8556-bb04fae06538" 

但我怎麼會找一個和下一個產品的GUID?

記住:該產品表沒有自動增量列,我不能輕鬆地添加一個,因爲我在對數據庫的控制我不是...

編輯:

的記錄被訂購時間戳列。

+3

你能明確什麼 「下一步」 和 「上」 是指?是由這個排序暗示...通過插入時間,產品名稱的字典順序,一些任意的用戶定義的順序... – EMPraptor 2009-11-14 06:13:21

+0

@empraptor:好點,對不起,我忘了提及這一點。我檢查並且數據應該按照插入的順序排序。因此,如果產品X在Y之前插入,那麼X是Y的前一個。 – Max 2009-11-14 06:30:00

+0

關係數據庫作爲一般規則是無序表,除非添加了通常無法可靠地告訴訂單的人工方法(時間戳列或標識)行被插入。無論如何,爲什麼插入的訂單對最終用戶而言是有意義的? – JohnFx 2009-11-14 06:33:09

回答

0

我很困惑....

關於傑夫的答案;如果產品沒有命名架構(隨機?)產品如何在輸出頁面中排序?

如果輸出的頁面被戳只,然後從傑夫的回答可以用where子句的一個小改變可以使用排序:

select guid from product 
where timestamp < (select timestamp from product where name = 'Product 2') 
order by timestamp desc limit 1; 

,另一種:

select guid from product 
where timestamp > (select timestamp from product where name = 'Product 2') 
order by timestamp asc limit 1; 


或者從 '產品2' 使用GUID:

select guid from product 
where timestamp < (select timestamp from product where GUID = guid_from_product2) 
order by timestamp desc limit 1; 

,另一種:

select guid from product 
where timestamp > (select timestamp from product where guid = guid_from_product2) 
order by timestamp asc limit 1; 

問候
          Sigersted

1

哇,這太可怕了。

會這樣的工作?假設您按名稱對產品進行分類。

如果你的產品2頁...

要獲得產品1:

select guid from product where name < 'Product 2' order by name desc limit 1; 

要獲取產品3:

select guid from product where name > 'Product 2' order by name asc limit 1; 

注意,壞的事情會發生如果你有同名的產品。

+0

不幸的是,這些產品沒有命名模式,所以這不是一個選項。是的,它真的很可怕。 – Max 2009-11-14 06:31:09

相關問題