我想显示一个图片库,在视图页面上,应该能够看到一堆缩略图:当前图片,包含前两个条目和下两个条目。
获取两个next / prev的问题是我不能(除非我弄错了)选择像MAX(id)WHERE idxx这样的东西。
有什么想法吗?
注意:当然不遵循ID,因为它们应该是多个WHERE实例的结果。
由于 马歇尔
答案 0 :(得分:4)
你必须原谅SQL Server样式的变量名,我不记得MySQL是如何进行变量命名的。
SELECT *
FROM photos
WHERE photo_id = @current_photo_id
UNION ALL
SELECT *
FROM photos
WHERE photo_id > @current_photo_id
ORDER BY photo_id ASC
LIMIT 2
UNION ALL
SELECT *
FROM photos
WHERE photo_id < @current_photo_id
ORDER BY photo_id DESC
LIMIT 2;
此查询假定您可能具有不连续的ID。从长远来看,它可能会成为问题,如果你的表中有很多照片,因为经常在之后评估,从数据库中检索整个结果集。 YMMV。
在高负载情况下,我可能会使用这些查询,但我也会定期对它们进行预生成,以便每张照片都有PreviousPhotoOne,PreviousPhotoTwo等列。这需要更多的维护,但是当你有大量的静态数据并且需要性能时它会很好用。
答案 1 :(得分:3)
如果您的ID是连续的,您可以
where id >= @id-2 and id <= @id+2
否则我认为您必须union
3个查询,一个用于获取具有给定ID的记录,另外两个用于top
和order by
这样的
select *
from table
where id = @id
union
select top 2 *
from table
where id < @id
order by id desc
union
select top 2 *
from table
where id > @id
order by id
性能不会太差,因为您没有检索大量数据,但由于使用union
而不会很好。
如果您发现性能开始出现问题,可以添加列来保存上一个和下一个项目的ID;使用触发器或夜间过程或其他东西来计算ID。这意味着您只需要进行一次硬查询而不是每次需要它。
答案 2 :(得分:3)
我认为这种方法应该适用于非连续ID,并且应该比使用UNION更有效。 currentID将使用SQL中的常量或从程序传递来设置。
SELECT * FROM photos WHERE ID = currentID OR ID IN (
SELECT ID FROM photos WHERE ID < currentID ORDER BY ID DESC LIMIT 2
) OR ID IN (
SELECT ID FROM photos WHERE ID > currentID ORDER BY ID ASC LIMIT 2
) ORDER BY ID ASC
答案 3 :(得分:0)
如果你只是对id的上一个和下一个记录感兴趣,你可能不会只有一个where子句,它使用多个WHERE限制WHERE id = xx,xx-1,xx-1,xx + 1,xx + 2从句或使用WHERE IN?