使用MySQL选择ID周围的前后行

10
我需要通过mySQL获取某个ID附近的ID。
示例:
表中的ID:
示例:
表中的ID:
2, 4, 5, 9, 11, 15, 19, 22, 25

我需要知道ID 9周围的5个ID,例如。 查询应返回:

4, 5, 9, 11, 15

谢谢!

1个回答

16

一个可能的解决方案是:

  • 计算每个id与你的ID之差的绝对值。
  • 按结果排序并将结果集限制为5条记录。

SQL语句

SELECT ABS(ID - 9), *
FROM   MyTable
ORDER BY
       ABS(ID - 9)
LIMIT  5

编辑 (感谢ypercube指出此解决方案可能存在的缺陷)

如果意图是从左侧获取两个ID和从右侧获取两个ID,那么可以按照以下方式调整该语句

SELECT * FROM MyTable WHERE ID <= 9 ORDER BY ID DESC LIMIT 3 
UNION ALL
SELECT * FROM MyTable WHERE ID > 9  ORDER BY ID ASC  LIMIT 2

1
当然,您的意思是 ORDER BY ABS(id - @id),其中 @id 是特定的 id(例如示例中的 9)。 - ypercubeᵀᴹ
@ypercube - 谢谢,你是对的。* 我使用实际值,因为我认为 @ 是 SQL Server 语法。如果我错了,请纠正我。 - Lieven Keersmaekers
1
关于变量,这取决于他是如何传递它们的(PHP、存储过程等)。MySQL中不同类型变量的一个很好的例子:MySQL: @variable vs. variable. Whats the difference? - ypercubeᵀᴹ
为了获取区间值,我添加了子句 WHERE ABS(ID - 9) BETWEEN -3 AND 3 并移除了 LIMIT 5 - Hugo Demiglio
1
这两个查询在MariaDB 10.3.23上都会产生语法错误。第一个查询在*符号处出错,第二个查询在UNION关键字处出错。 - Tejes
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接