执行此操作的最佳解决方案是什么:
我有一个查询(例如SELECT * FROM products WHERE category = 12 ORDER BY price DESC
),用户点击了此查询返回的其中一个产品。
因此,在此示例中,查询返回产品1,3,7,4,10,6,8,9和15.用户单击产品10
。现在我想要一个产品6和产品4的“下一个”和“上一个”链接。
我怎样才能获得这两个ID?
答案 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
以前的。