【问题标题】:Select before and after rows around id with mysql使用mysql在id周围选择前后行
【发布时间】:2012-04-11 07:25:02
【问题描述】:

我需要使用 mySQL 获取 ID 周围的 ID。

例子:

表中的ID:

2, 4, 5, 9, 11, 15, 19, 22, 25

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

4, 5, 9, 11, 15

谢谢!

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    一个可能的解决方案是

    • 计算每个 id 减去你的 ID 的绝对值。
    • 对结果进行排序并将结果集限制为 5 条记录。

    SQL 语句

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

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

    如果意图是从左侧获取2个id,从右侧获取2个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
    

    【讨论】:

    • 当然你的意思是ORDER BY ABS(id - @id),其中@id是具体的id(例子中是9
    • @ypercube - 谢谢,你是对的。 *我使用了实际值,因为我相信@ 是 SQL Server 语法。如果我错了,请纠正我。
    • OP 不清楚他所说的“ID 周围的 ID”是什么意思,所以这是两种可能的情景之一。对于 ID 为:4,5,6,7,8,9,23,47,此查询将显示5,6,7,8,9,这很好(因为 OP 的意图尚不清楚)。另一种情况是从左侧显示两个 ID,从右侧显示两个 ID:7,8,9,23,47
    • 关于变量,这取决于他如何传递它们(PHP、存储过程等)。 MySQL 上不同类型变量的一个很好的例子:MySQL: @variable vs. variable. Whats the difference?
    • 这两个查询都会在 MariaDB 10.3.23 上产生语法错误。第一个在* 符号处,第二个在UNION 关键字处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多