2011-03-05 35 views
6

什么是做到这一点的最佳解决方案:MySQL的一首/下一记录

我有一个查询(例如SELECT * FROM products WHERE category = 12 ORDER BY price DESC)和用户点击了该查询返回的产品之一。

因此在此示例中,查询返回产品1,3,7,4,10,6,8,9和15.用户单击产品10。现在我需要产品6和产品4的“下一个”和“上一个”链接。

如何获得这两个ID?

+1

你可以看到这些ID。假设将某些地方存放在列表或数组中。并将下一个和上一个(使用索引)作为隐藏字段值传递给模板。在视图中,您可以传递这些参数。从哪里可以调用适当的dbapi方法。 – Tauquir 2011-03-05 10:43:54

回答

8

首先您应该注意您的订购是没有明确定义

如果两个对象具有相同的价格,这两个项目的相对顺序是不确定的,并且可能会从查询变为查询。所以你的订单需要有一个平局,以保证订单的一致性。如果你有一个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 
+0

伙计,这个答案很有用。我全方位地寻找答案,而你的工作很简单。我唯一的问题是:使用OR子句喜欢它,是不是需要围绕价格和ID的第一个“组”来插入括号? – 2012-07-17 02:39:16

0

根据您使用的框架,您应该将查询包装在寻呼机查询中。然后你将能够获得下一个和上一个按钮。

如果使用普通的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 

了以前。

+0

这工作?我不这么认为。如果我的订单是1,4,2,7等? – Simon 2011-03-05 11:18:15

1

您可以应用相同的主要由戈库尔ñK作为建议,除了包括完整的订单,并添加启动到了极限:

SELECT * FROM products WHERE category = 12 ORDER BY price, id DESC LIMIT 5, 5 

(在你的榜样产品10是列表中的第5)。链接到下一个和以前的产品将使用完全相同的查询,只是增加或减少LIMIT限制。

这样您只需要跟踪列表中的项目总数和当前正在查看的项目总数。

请注意,当M变大时,LIMIT M,N不具有很好的性能。