在单个SQL查询中获取两个下一个和前两个条目

时间:2009-01-02 12:09:51

标签: sql mysql database

我想显示一个图片库,在视图页面上,应该能够看到一堆缩略图:当前图片,包含前两个条目和下两个条目。

获取两个next / prev的问题是我不能(除非我弄错了)选择像MAX(id)WHERE idxx这样的东西。

有什么想法吗?

注意:当然不遵循ID,因为它们应该是多个WHERE实例的结果。

由于 马歇尔

4 个答案:

答案 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的记录,另外两个用于toporder 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?