什麼是做到這一點的最佳解決方案:MySQL的一首/下一記錄
我有一個查詢(例如SELECT * FROM products WHERE category = 12 ORDER BY price DESC
)和用戶點擊了該查詢返回的產品之一。
因此在此示例中,查詢返回產品1,3,7,4,10,6,8,9和15.用戶單擊產品10
。現在我需要產品6和產品4的「下一個」和「上一個」鏈接。
如何獲得這兩個ID?
什麼是做到這一點的最佳解決方案:MySQL的一首/下一記錄
我有一個查詢(例如SELECT * FROM products WHERE category = 12 ORDER BY price DESC
)和用戶點擊了該查詢返回的產品之一。
因此在此示例中,查詢返回產品1,3,7,4,10,6,8,9和15.用戶單擊產品10
。現在我需要產品6和產品4的「下一個」和「上一個」鏈接。
如何獲得這兩個ID?
首先您應該注意您的訂購是沒有明確定義。
如果兩個對象具有相同的價格,這兩個項目的相對順序是不確定的,並且可能會從查詢變爲查詢。所以你的訂單需要有一個平局,以保證訂單的一致性。如果你有一個ID字段,你可以使用它作爲決勝:
ORDER BY price DESC, id
要實現未來:
SELECT *
FROM products
WHERE category = 12
AND price = (SELECT price FROM products WHERE id = 10) AND id > 10
OR price > (SELECT price FROM products WHERE id = 10)
ORDER BY price DESC, id
LIMIT 1
上是相似的,但隨着條件和順序顛倒:
SELECT *
FROM products
WHERE category = 12
AND price = (SELECT price FROM products WHERE id = 10) AND id < 10
OR price < (SELECT price FROM products WHERE id = 10)
ORDER BY price, id DESC
LIMIT 1
夥計,這個答案很有用。我全方位地尋找答案,而你的工作很簡單。我唯一的問題是:使用OR子句喜歡它,是不是需要圍繞價格和ID的第一個「組」來插入括號? – 2012-07-17 02:39:16
根據您使用的框架,您應該將查詢包裝在尋呼機查詢中。然後你將能夠獲得下一個和上一個按鈕。
如果使用普通的PHP然後存儲在一個變量的當前產品叫$current_id
SELECT *
FROM products WHERE category = 12
AND id > $current_id
ORDER BY price DESC, id
LIMIT 1
明年和
SELECT *
FROM products WHERE category = 12
AND id < $current_id
ORDER BY price DESC, id
LIMIT 1
了以前。
這工作?我不這麼認爲。如果我的訂單是1,4,2,7等? – Simon 2011-03-05 11:18:15
您可以應用相同的主要由戈庫爾ñK作爲建議,除了包括完整的訂單,並添加啓動到了極限:
SELECT * FROM products WHERE category = 12 ORDER BY price, id DESC LIMIT 5, 5
(在你的榜樣產品10是列表中的第5)。鏈接到下一個和以前的產品將使用完全相同的查詢,只是增加或減少LIMIT限制。
這樣您只需要跟蹤列表中的項目總數和當前正在查看的項目總數。
請注意,當M變大時,LIMIT M,N不具有很好的性能。
你可以看到這些ID。假設將某些地方存放在列表或數組中。並將下一個和上一個(使用索引)作爲隱藏字段值傳遞給模板。在視圖中,您可以傳遞這些參數。從哪裏可以調用適當的dbapi方法。 – Tauquir 2011-03-05 10:43:54