MySQL下一个/上一个记录

6

如何解决这个问题:

我有一个查询(例如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
3个回答

8

首先需要注意的是,您的排序不是明确定义的

如果两个对象具有相同的价格,则这两个项目的相对顺序是不确定的,并且可能会在查询之间发生变化。因此,您的order by需要有一个tie-breaker来保证顺序的一致性。如果您有一个id字段,可以将其用作tie-breaker:

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”组合是否需要括号? - random_user_name

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的性能并不好。


0
根据您使用的框架,您应该将查询封装在分页查询中。然后,您就可以获得下一个和上一个按钮。
如果您正在使用纯PHP,则将当前产品存储在名为$current_id的变量中。
SELECT *
FROM products WHERE category = 12
AND id > $current_id
ORDER BY price DESC, id
LIMIT 1

for next和

SELECT *
FROM products WHERE category = 12
AND id < $current_id
ORDER BY price DESC, id
LIMIT 1

用于之前的操作。


这个能正常工作吗?我觉得不行。如果我的顺序是1、4、2、7等怎么办? - Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接