【问题标题】:Getting the previous and next step unique ID based on current step number根据当前步骤编号获取上一步和下一步唯一ID
【发布时间】:2012-06-22 18:12:10
【问题描述】:

简单的问题,但我似乎找不到简单的解决方案:

在给定以下数据的情况下,根据当前步骤编号获取上一步和下一步唯一 HEX ID 的最有效方法是什么:

----+-------------+----------------
ID  | UnqID   |步骤编号 |
----+-------------+----------------
21 | BcDeF   | 1        |
22 | GhIjKL   | 2        |
23 | MnOPq  | 3        |
24 | | RsTuV   | 4        |
25 | wXyZa   | 5        |
----+-------------+----------------

例如:
假设提供的步骤是3,我如何获得24 的唯一HEX ID?

谢谢!


编辑
这是我目前正在使用的,但对我来说似乎效率不高??

SELECT
    nxt.stepnum AS NextStep,
    nxt.unqID AS NextUnqID,
    prv.stepnum AS PrevStep,
    prv.unqID AS PrevUnqID
FROM foo w,
(
 SELECT stepnum, unqID FROM foo WHERE stepnum > 3 ORDER BY stepnum LIMIT 1
) AS nxt
,
(
 SELECT stepnum, unqID FROM foo WHERE stepnum < 3 AND ORDER BY stepnum DESC LIMIT 1
) AS prv
WHERE w.stepnum = 3

【问题讨论】:

  • IDSTEPNUM 都是唯一的吗?
  • 是的,一个是 PK,另一个是 VARCHAR(7) HEX 字符串。
  • 上一个和下一个基于什么?不保证 mysql 中的行顺序。见here
  • stepnums 之间是否有任何差距,或者他们保证会增加+1?
  • 步骤可能有差距;即:1,2,4,5。

标签: mysql sql


【解决方案1】:

我修改了您的查询。虽然它有点嵌套,但它应该由非常简单的 sql 引擎索引查找组成(理论上......)

SELECT
    nxt.stepnum AS NextStep,
    nxt.unqID   AS NextUnqID,
    prv.stepnum AS PrevStep,
    prv.unqID   AS PrevUnqID

FROM (SELECT NULL) AS dummy -- dummy table to LEFT JOIN to

LEFT JOIN
( SELECT stepnum, unqID FROM foo
  WHERE stepnum = (SELECT MIN(stepnum)
                   FROM foo
                   WHERE stepnum > 5 )
) AS nxt ON true

LEFT JOIN
( SELECT stepnum, unqID FROM foo
  WHERE stepnum = (SELECT MAX(stepnum)
                   FROM foo
                   WHERE stepnum < 5 )
) AS prv ON true

【讨论】:

  • 我喜欢使用MAXMIN——订单/限制是我不喜欢我的查询的地方!我假设嵌套选择是解决这个问题的唯一方法?
  • 如果 MySQL 的笨拙优化器能够识别这种情况就好了,但它可能不会。
  • 玩弄玩玩,查看执行计划(当然现实世界可能不一样):sqlfiddle.com/#!2/b61db/1
  • 好的,谢谢 biziclop。我喜欢这种修改,所以我将继续使用它。感谢您的帮助!
  • 该死,遇到了一个问题:如果没有上一步/下一步,我就没有结果。例如,在您的小提琴中将步骤设置为5
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
相关资源
最近更新 更多