SQL在特定行周围选择“窗口”

很可能以前曾经问过像这样的问题,但我想不出要搜索的术语.

我正在制作一个照片库应用程序,并希望显示9个缩略图,显示当前正在显示的照片的上下文(在3×3网格中,当前照片位于中央,除非当前照片显示在前4张照片中,在这种情况下,如果当前照片是第二张,我想选择照片1到9).例如,给定一个包含带有ID的照片列表的相册:

1,5,9,12,13,18,19,20,21,22,23,25,26

如果当前照片是19,我还想查看:

9,23

如果当前照片为5,我还要查看:

1,21

我一直在想一些类似的东西:

SELECT *
FROM photos
WHERE ABS(id - currentphoto) < 5
ORDER BY id ASC 
LIMIT 25

但这不适用于ids是非连续的(如上例所示),或者当前照片之前照片不足的情况.

有什么想法吗?

谢谢,

大教堂

附:如果有任何不清楚的地方请发表评论,我会澄清这个问题.如果有人能想到一个更有用的标题来帮助其他人将来找到这个问题,那么请评论.

解决方法

可能只需使用UNION,然后在显示结果的过程代码中修剪额外的结果(因为这将在非边缘情况下返回20行):
(SELECT 
     * 
FROM photos
   WHERE ID < #current_id#
   ORDER BY ID DESC LIMIT 10)
UNION
  (SELECT *
   FROM photos
   WHERE ID >= #current_id#
   ORDER BY ID ASC LIMIT 10)
ORDER BY ID ASC

编辑:正如le dorfier所建议的那样,UNION双方的限制增加到10.

编辑2:修改以更好地反映最终实施,如Dominic所建议的那样.

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03