MySQL下一个/上一个记录

时间:2011-03-05 10:35:58

标签: mysql

执行此操作的最佳解决方案是什么:

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

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

我怎样才能获得这两个ID?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以应用Gokul N K建议的相同本金,但包括完整订单并添加一个限制的开头:

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

(在您的示例中,产品10在列表中排名第5)。链接到下一个和上一个产品将使用完全相同的查询,只是增加或减少LIMIT限制。

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

请注意,当M变大时,LIMIT M,N的性能不佳。

答案 2 :(得分: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

以前的。