如何解决这个问题:
我有一个查询(例如SELECT * FROM products WHERE category = 12 ORDER BY price DESC
),用户点击了该查询返回的产品之一。
因此,在此示例中,查询返回产品1、3、7、4、10、6、8、9和15。用户单击产品10
。现在我想要一个“下一个”和一个“上一个”链接到产品6和产品4。
如何获取这两个ID?
如何解决这个问题:
我有一个查询(例如SELECT * FROM products WHERE category = 12 ORDER BY price DESC
),用户点击了该查询返回的产品之一。
因此,在此示例中,查询返回产品1、3、7、4、10、6、8、9和15。用户单击产品10
。现在我想要一个“下一个”和一个“上一个”链接到产品6和产品4。
如何获取这两个ID?
首先需要注意的是,您的排序不是明确定义的。
如果两个对象具有相同的价格,则这两个项目的相对顺序是不确定的,并且可能会在查询之间发生变化。因此,您的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
SELECT * FROM products WHERE category = 12 ORDER BY price, id DESC LIMIT 5, 5
(在您的示例中,产品10是列表中的第5个)。链接到下一个和上一个产品将使用完全相同的查询,只需递增或递减LIMIT限制。
这样,您只需要跟踪列表中的总项目数以及您当前正在查看的项目即可。
请注意,当M变大时,LIMIT M,N的性能并不好。
$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
用于之前的操作。