2012-05-26 64 views
0

我在我的網站上有一個圖片庫,我想實現一個下一個/上一個按鈕,一旦我到達數據庫的末尾,它會被髮送回第一張圖片。Mysql下一個和上一個記錄問題

我有一個用於下一個按鈕的MYSQL查詢,問題來自上一個按鈕。我使用與下一個按鈕相同的代碼(更改值以使其工作),但它仍停留在我的數據庫的第一項。

我正在排序列表id只是一個自動增量字段。

這是我的下一個代碼:

SELECT * 
FROM photos 
WHERE 
     id = (SELECT MAX(id) FROM photos WHERE status = '0' AND id < ".$id.") 
     OR id = (SELECT MAX(id) FROM photos WHERE status = '0') 
LIMIT 1 

這是我以前不工作代碼:

SELECT * 
FROM photos 
WHERE 
     id = (SELECT MIN(id) FROM photos WHERE status = '0' AND id > ".$id.") 
     OR id = (SELECT MIN(id) FROM photos WHERE status = '0') 
LIMIT 1 

的$ id變量是當前圖片的ID。

我知道那裏有很多關於SO的下一個/上一個問題,但我沒有找到任何幫助我的東西。

+0

我認爲你已經混淆了這兩個。第一個查詢應該用於NEXT,第二個用於PREVIOUS。 – JHS

回答

0

您的問題來自您的WHERE子句中的第二個OR操作數,該操作數在兩個查詢中均包含第一張/最後一張照片,與結果集中的當前位置無關;因爲如果沒有指定ORDER BY子句,MySQL不會保證返回這些結果的順序,所以第一個項目可能會在您想要的前一個項目之前進行排序,因此LIMIT子句僅導致返回該項目。

您可以通過指定分別和ORDER BY id DESC解決ORDER BY id ASC這個問題,但這樣的測試真的應該採取基於任何結果是否會返回—所以我建議完全刪除這些操作數您的應用程序內進行。

然後,您可以簡化您的疑問,未來:

SELECT * 
FROM  photos 
WHERE status = 0 AND id < $id 
ORDER BY id DESC 
LIMIT 1 

而對於以前:

SELECT * 
FROM  photos 
WHERE status = 0 AND id > $id 
ORDER BY id ASC 
LIMIT 1 

(這是假設你沒有真正打算讓「下一步」即可獲得具有較低照片id,併爲「前一個」獲得一個具有較高的id;否則交換兩個查詢周圍)。

+0

好吧,我明白了所有這些,但我希望一旦你到達數據庫的末尾,它就會回到起點,我希望它能夠循環。這是我無法工作的唯一部分。 –

+0

@JorisBlanc:在您的應用程序中實現該邏輯。例如,如果上述查詢中沒有返回結果,則根據需要選擇最大/最小ID以查找環繞項目。 – eggyal

+0

這就是我想要做的,但是有沒有辦法只做一個'if'和'else'的某種查詢,或者我應該只使用php if ... else語句。 –

相關問題